系列文章目录
文章目录
- 系列文章目录
- 一、模块的概念
- 二、模块导入
- 1. `import`导入
- 2. `from...import...`导入
- 三、模块相关的补充
- 四、模块编写规范
一、模块的概念
- 模块的概念:
在Python中,一个.py
文件就是一个模块,模块是比类更高一级的封装。文件名就是模块的名字,模块里面包含了一些有特定功能的代码,一般是给其他程序使用的。
就像是工具箱或一堆零件,要什么工具或零件从里面拿就是了。
- 模块的分类:
- 内置模块:python自带的模块,如time模块;
- 第三方模块:由其他大佬程序员写的,我们安装后就可以使用;
- 自定义模块:由我们自己写的模块,命名风格与变量的一致;
- 模块的三种形式:
- 使用python编写的
.py
文件。 - 被编译为共享库或DLL的C或C++扩展。(了解)
- 使用C语言编写并连接到python解释器的内置模块。(了解)
- 模块的作用:
- 内置模块与第三方模块需要哪个就用哪个,拿过来就能用,不需要自己写,省时省力;
- 自定义模块需要自己写,通常将一些经常要用的代码写在模块中,在有需要的地方使用,提高了代码的重用率。
二、模块导入
在使用模块里面的东西前,需要先导入模块!
1. import导入
- 用法:
- 使用import关键字,导入模块;
- 导入时因遵守内置、第三方、自定义的导入顺序,且应该用空行隔开;
- 一行可以导入多个,但尽量一行一个的导入;
- 使用时以
模块名.xxx
的形式调用;
import time, random, …… # 一行多个
import 第三方1
import 第三方2
import 自定义1
import 自定义2
time.time() # 返回时间戳
- 使用as关键字可以给模块起别名:
import numpy as np
np.array()
import
导入模块时,python解释器执行的操作:
- 创建一个该模块的命名空间;
- 执行该模块内的代码;
- 将执行过程中产生的名称放进,模块的命名空间;
- 在当前程序的命名空间中放入模块的名称,该名称指向模块的命名空间。
__name__
属性:
这是每个python文件都有的属性,
- 当
foo.py
被执行时,__name__
的值为__main__
; - 当
foo.py
被当作模块导入时,__name__
的值为模块名foo
;
使用if判断,可以避免模块内不应该在导入时执行的代码被执行:
def foo():
pass
def bar():
pass
foo() # 被导入时,foo()会执行
if __name__ == '__main__':
bar() # 被导入时,bar()不会执行
2. from...import...导入
- 用法:
from...import...
的用法与import
基本相同,不同之处在于可以按照需要取出模块中的一部分。
假设我们只需要foo
模块下的bar
函数,不需要其他的,可以这样写:
from foo import bar
from time import * # 导入全部
bar() # 不需要加模块名前缀
from...import...
导入后,调用时不需要加模块名前缀;
可以和as关键字连用。
可以使用*
导入模块内的全部名称。
三、模块相关的补充
__all__
变量的作用:__all__
是一个列表,里面写入该模块内的名称,使用*
来导入的时候,其实就是导入列表中指出的所有名称。
__all__ = ['foo', 'bar', 'baz']
一旦定义,则只能导入__all__
中的名称!
sys.path
的作用:sys.path
是一个列表,保存着一些文件夹路径,python搜索模块的时候,会按照顺序在这些文件夹里面找。
手动添加路径,以便python查找:
sys.path.append(r'/user/python/foo.py')
- 模块搜索优先级:
- 先内存
- 后外存(按照
sys.path
中,存放的文件夹的顺序查找)
- 查看已导入的模块:
sys.modules
是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules
都将记录这些模块。sys.module
对加载模块起到了缓存作用。当某个模块第一次被导入时,sys.modules
将自动记录该模块。当第二次再导入时,python会直接到sys.modules
中查找,从而加快了程序运行的速度。
四、模块编写规范
我们编写的代码,不仅是给自己用,还有可能会被别人拿去用。因此,代码的可读性与可维护性十分重要,这就需要我们按照一定的规范去书写程序。
注意以下程序的写法和定义顺序:
#!/usr/bin/python # 指定解释器路径,通常只在unix环境有效
"""
模块的文档描述
"""
import sys 导入模块
x = 1 # 定义全局变量
class Foo:
"""类的文档说明"""
pass
def bar():
"""函数的文档说明"""
pass
if __name__ == '__main__':
bar()