在一个文件中的代码越长,文件的可维护性就越差。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少。在Python中每一个.py文件称为一个Module。
使用Module的优点:
1.最大的好处是大大提高了代码的可维护性。
2.使用模块还可以避免函数名和变量名冲突(只要注意不要与Python的内置函数名冲突)
为了避免由于Module的名字相同导致冲突所以引入了package的概念------通过package来组织Module。引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。每一个包目录下面都会有一个init.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为init.py本身就是一个模块。
使用Module
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module ' #任何模块代码的第一个字符串都被视为模块的文档注释
__author__ = 'Michael Liao' #瞻仰作者大名
import sys
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
#注意这两行代码当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
if __name__=='__main__':
test()
作用域
有的函数或变量我们仅仅希望在Module内部使用,在Python中华通过前缀_实现。
正常的函数和变量名是公开的(public),可以被直接引用;类似xxx这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的author,name就是特殊变量;类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等。
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
安装第三方Module
Python中安装第三方Module是通过包管理工具pip完成的。注意区别pip和pip3.
pip install Pillow
安装常用的模块请直接anaconda。
Module搜索路径
#当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错
>>> import mymodule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named mymodule
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中
>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
增加搜索目录
#方法一:在运行时修改,运行结束后失效。
>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')
#方法二:设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。