1.模块的基本概念
定义:模块是从逻辑上组织python代码的形式
当代码量变得相当大它的时候,最好把代码分成一些有组织的代码段,并为其取一个名称
这些代码段中可能有定义好的成员变量或函数。
当我们需要使用该模块的成员变量或函数的时,我们可以导入并使用它们
2.创建模块
模块物理层面上组织模块的方法时文件,每一个以.py作为结尾的python文件都是一个模块
模块名称不能与系统已存在的模块重名
当调用模块是去掉后缀.py,如import random
3.模块搜索路径
模块的导入需要一个叫做‘路径搜索’的过程
python在文件系统的‘预定义区域’中查找要调用的模块
搜索路径在sys模块中定义
>>> import sys
>>> print(sys.path)
['', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6', '/usr/local/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/site-packages']
需要注意的是,如果你定义了一个模块,就把他放在合适的位置,比如/usr/local/lib/python3.6 下
可以看到sys.path列表第一个变量是‘’,代表当前目录下的模块
[root@myhost mnt]# ls #确认咋当前目录下
mymode.py
[root@myhost mnt]# python3
>>> import mymode #可以导入
>>>
[root@myhost mnt]# cd .. #切换目录
[root@myhost /]# python3
>>> import mymode #导入失败
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'mymode'
>>>
4.导入模块
使用import导入模块
模块变量或函数通过模块名.属性调用
如果仅需要模块中的某些属性,也可以单独导入
from random import randint
导入random模块的randint方法
5.模块加载(load)
一个模块只被加载一次,无论它被导入多少次,因为当两个文件相互导入的时候,防止了无限的相互加载
模块加载时,顶层代码会自动执行,所以只将函数放入模块的顶层是良好的编程习惯
顶层代码:
1 PP = 3.14
2
3 def main():
4 print "PP:", PP
5
6 main()
7
8 #上面的第一行,第三行,第六行的代码则是顶层代码。
6.__name__: 对被调用的模块中的重名方法做判断的工具
模块具有一个__name__的特殊属性
当在一个python文件中调用一个模块时,这个模块的__name__就是它的模块名
而在自己的文件中输出__name__时,输出结果为__main__
假设有两个文件py1.py和py2.py,我们在py2.py中调用py1.py
#Py1.py
2 #!/usr/bin/env python
3 def test():
4 print("this is py.1")
5
1 #Py2.py
2 #!/usr/bin/env python
3 import Py1
4 def test():
5 print("this is py.2")
6
7 test()
8 print (Py1.__name__)
9 print (__name__)
输出结果:
Py1
__name__
那为什么说__name__是对被调用的模块中的重名方法做判断的工具呢?
通过结果可以知道,Py2.py直接执行,那么内建变量__name__的值为__main__,否则为模块的名字,通过这个特性可以在if语句里面添加测试代码,可以提高减少BUG,提高程序的健壮性。
if __name__ == '__main__':
test()
判断__name__是否是__main 即确保这个方法是Py2在调用