Python模块(Module)是一个Python文件,该文件以 .py为后缀名,该文件就叫做一个模块。
这个Python文件中,包含了Python对象定义和Python语句。
我们可以把相关的代码写在一个模块里,这样代码就更易懂。
每一个模块在Python里都被看做是一个独立的文件。模块可以被项目中的其他模块,脚本,甚至是交互式解析器所使用。从而使用该模块里的函数等功能。
一、Python模块的分类
系统内置的模块,例如:sys、time、json模块等;
自定义模块,即自己编写的模块,对某段逻辑或某些函数进行封装后供其他函数调用。注意自定义模块的命名一定不能和系统内置的模块重名,否则将不能导入系统的内容模块了。
第三方开源模块:这部分模块可以通过pip install进行安装,有开源的代码;
二、Python模块的使用
要想使用模块,必须先要将模块加载进来,可以通过关键字import或from进行加载;
2.1模块的构成
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行,并且将模块名加载到内存中,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块的语句。
import语句可以在程序中的任意位置使用。且同一个模块可以多次import
#我们定义一个模块,名为test_module.pyprint('老树Python:一步一步学Python3系列')
将该文件保存到我们的程序目录下。
#新建一个T25.py运行文件#import导入test_module模块import test_module
将该文件保存到我们的程序目录下(与test_module.py同目录)
运行结果:
上面例子可以看出,运行T25.py,在导入test_module时,已经执行了test_module.py中的print()语句。
我们再来改一下T25.py代码,使其多次import test_module,看是否也多次执行print()语句
代码及运行结果截图如下:
由上述结果可知,四次调用模块,只print()了一次,这是因为每次导入模块时,解释器都会去检查一下这个模块有没有之前被导入过。
2.2模块导入的过程
找到这个需要导入的模块
判断这个模块是否被导入过
A 如果该模块没有被导入过:
创建一个属于这个模块的命名空间;如果用户没有定义变量来引用这个模块的内存地址的话,那么就使用模块的名称来引用这个模块地址;
import test_module
上述就是使用test_module模块名来引用这个地址。
也可以使用as name 给导入模块起别名来指定变量接受这个内存地址,那么就将内存地址赋值给这个变量,且下文在调用时只能使用这个变量进行调用,不能再使用模块名进行调用了。
import test_module as tm#后面调用只能使用 tm进行调用了。
B 如果该模块已经被导入过:
解释器不会重新执行模块内的语名,后续的import语句仅仅是对已经加载到内存中的模块的对象增加一次引用
导入的模块与当前模块关系
导入的模块会重新开辟一块独立的名称空间,定义在这个模块中的函数把这个模块的命名空间当做全局命名空间,这样的话当前的空间就和模块运行的空间分隔了,谁也不影响谁。
继续修改test_module.py代码:
#test_module.pyprint('老树Python:一步一步学Python3系列')def sum_num(a,b): return a+b
我们来看在T25.py中直接导入运行:
我们可以看到函数sum_num没执行。因为我们没有调用,所以没有执行。
那我们现在在T25.py中调用test_module中的sum_num函数
import test_modulenum = test_module.sum_num(5,6)print(num)
上述代码中num=test_module.sum_num(5,6)中test_module是由import引入的模块命名空间,.sum_num(5,6),是代表在调用test_module模块中sum_num()函数。
运行结果:
由上述结果我们可以看到T25.py调用sum_num()返回的值正确
我们再来把import test_module 改为别名引用
import test_module as tmnum = tm.sum_num(5,6)print(num)
运行的结果,同上图一致。
别名引用可以简化代码或让别名更容易理解易懂。
我们在T25.py引用模块test_module中的函数时,编辑器VS Code智能提醒,会提示你模块中的函数供你使用。
2.3导入多个模块
方法一: import os,time,sys等,每个模块之间用逗号隔开
方法二:
import osimport timeimport sys
推荐使用方法二,有时我们暂时不需要某个模块,直接注释就行。而方法一还要删了才行。
多个模块导入时顺序
模块应该一个一个的导入,先后顺序为:内置模块----->扩展(第三方)模块----->自定义模块。
因为我们在导入第三方模块时和自定义模块时,这些模块可能引用了内置模块或第三方模块,所以要先导入,否时会报错。
2.4 from ....import 导入
我们有时只想使用模块中的某些功能时,这时我们可以使用from.....import这样的格式来进行模块的某些功能的导入。而不需要用import导入所有模块。
我们继续来修改test_module.py
print('老树Python:一步一步学Python3系列')def sum_num(a,b): return a+bdef minus_num(a, b): return b-adef mul_num(a, b): return a*b
修改T25.py
from test_module import sum_num,minus_nums_num = sum_num(5, 6)m_num = minus_num(5,6)print(s_num)print(m_num)
运行截图:
可以看到我们通过 from ... import 导入某个功能时,就可以直接调用这个功能了。
from ... import 也支持 as name别名导入
from test_module import sum_num as sums ,minus_num as minuss s_num = sums(5, 6)m_num = minuss(5,6)print(s_num)print(m_num)
运行的结果一样。
结束语:
这篇我们主要分析了Python模块及导入的两种方法import 和 from ... import。一步步的示例可以让你更好的理解模块的导入使用。示例中的模块为我们自定义的模块。下一篇我们将学习如何导入第三方模块。并介绍一个常用的第三方模块命名用方法。