- 模块(module)可以有逻辑的组织代码段,把相关代码分配到一个模块里可以让代码更易懂。
- 简而言之,模块就是个保存了Python代码的文件。模块里可以定义函数、类和变量。
- 在Python中模块和java中的包、c语言中的头文件很类似。比如Python中要调用sqrt函数,必须先用import关键字引入math这个模块:
import math
print('25的平方根', math.sqrt(25)) # 输出5
一.导入模块的方式
- Python中使用关键字import来导入某个模块,例如:import 模块名。这种方法导入的模块,在调用模块中的函数时,必须用:模块名.函数名。
- 有时候我们只需要用到模块中的某个函数,只需要引入该函数即可。这时候可以通过语句:from 模块名 import 函数名1,函数名2……。通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名。
二.模块位置的搜索顺序
-
导入一个模块,Python解析器对模块位置的搜索顺序是:
1.当前目录
2.PYTHON PATH环境变量下的每个目录
3.安装过程决定的默认目录 -
模块搜索路径存储在system模块的sys.path变量中,变量包含上面123所说的路径。
三.列举模块内容
dir(模块名)函数返回一个排好序的字符串列表,内容是模块里定义的变量和函数。
import sys
print(dir(sys))
四.定义自己的模块
- 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。
示例:有一个文件fibo.py,在fibo.py中定义了三个函数add(a,b),fib_prt(n),fib_seq(n)
# fibo.py
def add(a, b):
return a + b
def fib_prt(n):
a, b = 0, 1
while b < n:
print(b, end='')
a, b = b, a + b
print()
def fib_seq(n):
result = []
a, b = 0, 1
result.append(0)
result.append(1)
while b < n:
result.append(b)
a, b = b, a + b
return result
那么在其他文件(如test.py中就可以使用)
import fibo
fibo.fib_prt(1000)#输出1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
可能出现“ModuleNotFoundError: No module named ‘fibo’“,是因为模块路径不在搜索范围内,没有找到。
可以通过sys.path查看搜索路径,通过sys.path.append(‘模块路径’),添加搜索路径。
- 在实际开发中,开发人员往往在模块中添加测试信息。
def add(a, b):
return a + b
# 用来测试
result = add(12, 22)
print("in testmodule.py file, 12+22=%d" % result)
如果其他py文件中引用了此文件,如:
import testmodule as tm
result = tm.add(11,22)
print(result)
输出结果:
in testmodule.py file, 12+22=34
33
- 在上面的案例中,发现测试代码也运行了。为了解决这个问题,python为每个模块提供了一个__name__属性,当其值为__main__的时候,表示该模块自身在运行,否则就是被引用。
def add(a, b):
return a + b
# 用来测试
if __name__ == '__main__':
result = add(12, 22)
print("in testmodule.py file, 12+22=%d" % result)
此时如果其他py文件中引用了此文件,如:
import testmodule as tm
result = tm.add(11,22)
print(result)
输出结果:
33
五.Python中的包
-
为了组织好模块,通常把多个模块放在一个包里面。包是Python模块文件所在的目录,且该目录下必须存在__init__.py文件。
此时如果main.py想要引用package_a中的模块module_a1,可以使用
from package_a import module_a1
或者
import package_a.module_a1 -
如果package_a中的模块module_a1想要引入另一个包package_b,则Python默认是找不到的。除非在package_a包的__init__.py文件中添加"sys.path.append(’…/’)"这句代码,并且在package_a包中所有模块都增加"import init"这句代码。
六.模块的发布
- 模块编写好之后,可以将其打包成可以安装的压缩包进行发布,以分享给其他开发人员。具体步骤如下:
(1)将要发布的包放在和setup.py文件同级的目录中。
(2)编辑setup.py文件,在该文件中指明需要包含哪些py文件。
(3)在当前路径下打开命令行窗口,使用build命令构建模块。
执行命令后,会在当前目录下新建一个build文件夹,该文件夹下的lib目录中存放了所有待发布模块的备份。
(4)使用sdist命令生成用于发布的压缩包。
执行命令后,在当前目录的dist目录下生成了最终发布的压缩包。
七.模块的安装
- 当程序需要引入一些外部模块时,可以从外部下载并安装。有些模块提供了自动安装的文件,直接双击就可以。但是大多数模块没有提供这样的安装方式。
- 以刚才发布的模块为例,安装步骤为:先找到模块的压缩包,解压。然后执行命令“python setup.py install“进行安装。
- 可以对安装的目录进行设定,如python setup.py install --prefix=安装路径
八.常用的标准模块
时间模块:time
日历模块:calendar
日期时间模块:datetime
随机模块:random
数学模块:math、cmath