在Python3中,一个模块就是一个*.py的Python源代码文件,其中可以定义类、函数和变量,还可以包含可执行程序段。您可以将您的Python程序代码按照逻辑/功能划分为不同的模块,将相似功能的代码组织到一个模块中,以便能更好的理解和使用。模块本身也是一个Python对象,可以在其它模块中通过名字导入和调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# -*- coding: utf-8 -*- # #!/usr/bin/python3 # fibo.py: Fibonacci numbers module # 1. 文件名即为模块名称bibo # 2. 定义模块内部的函数 def fib(n): # write Fibonacci series up to n a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print() def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result # 3. 定义模块内部的可执行代码段 if __name__ == "__main__": import sys fib(int(sys.argv[1])) |
1. 导入模块
Python3中使用 import 关键字导入模块,其语法如下:
1 2 3 |
import module1 [, module2 [, ... moduleN]] from module1 import name1[, name2[, ... nameN]] import module1 as md1 # 使用别名 |
其实际使用示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 1. 只导入模块名 import fibo fibo.fib(50) # 0 1 1 2 3 5 8 13 21 34 fibo.fib2(50) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] # 2. 只导入模块中指定的方法,此时在当前作用域中,模块名和模块内的其它方法将不能访问 from fibo import fib fib(50) # 0 1 1 2 3 5 8 13 21 34 # 3. 导入模块内部的全部方法, 此时在当前作用域中,仅模块名不能访问 from fibo import * fibo.fib(50) # 0 1 1 2 3 5 8 13 21 34 fibo.fib2(50) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] |
2. 将模块作为脚本文件执行
在一个模块中,可以通过全局变量 __name__ 来访问当前模块的名称。如果当前模块是作为主执行脚本,通过 $ python3 fibs.py 的方式启动的,则全局变量 __name__ 的值将被修改为”__main__”。因此可以通过在模块中添加 if __name__ == "__main__": do_something()来添加模块的可执行程序逻辑。
3. 查找模块
当导入一个模块时,Python解释器首先在内置模块中查找,若查找不到,则依照 sys.path 中存储的路径按顺序查找模块文件:
- 在当前目录中查找;
- 若查找不到,则在PYTHONPATH环境变量指定的目录中查找;
- 若查找不到,则在Python按照依赖目录中查找。
1 2 3 4 5 6 7 8 9 10 |
>>> import sys >>> for path in sys.path: ... print("\'{}\'".format(path)) ... '' '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip' '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7' '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload' '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages' >>> |
4. 模块相关内置函数
函数 | 说明 |
---|---|
dir([obj]) | 返回对象的有效名称列表,参数为空时返回当前作用域内的有效名称列表 |
locals() | 返回当前locals作用域的有效名称列表 |
globals() | 返回当前globals作用域的有效名称列表 |
reload(module) | 重新加载模块,若模块中有可执行代码,则将重新执行 |
5. 包
包是Python中定义单个应用的一种方式,它可以将多个模块或子模块按照文件目录结构的方式组织起来,通过命名空间访问不同目录下的模块。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
my_package/ __init__.py module1/ __init__.py module11.py module2/ __init__.py module21.py module22.py module4 __init__.py module41.py moudle3/ __init__.py module31.py |
当包的开发测试工作完成后,就可以部署或在其它项目中引用了。
1 2 3 |
import my_package.module1 from my_package import module2 from my_package.module2 import module4 |