## 模块的定义 Python有一种方法可以把定义放在一个文件里,并在脚本或解释器的交互式实例中使用它们。这样的文件被称作 模块 ;模块中的定义可以 导入 到其它模块或者 主 模块(你在顶级和计算器模式下执行的脚本中可以访问的变量集合)。 ```py # Fibonacci numbers module 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 ``` 现在进入Python解释器,并用以下命令导入该模块: ```py >>> >>> import fibo ``` 在当前的符号表中,这并不会直接进入到定义在 fibo 函数内的名称;它只是进入到模块名 fibo 中。你可以用模块名访问这些函数: ```py >>> >>> fibo.fib(1000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo' ``` 如果你想经常使用某个函数,你可以把它赋值给一个局部变量: ``` >>> >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ``` import 语句有一个变体,它可以把名字从一个被调模块内直接导入到现模块的符号表里。例如: ```py >>> >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ``` ## 以脚本的方式执行模块 当你用下面方式运行一个Python模块: ``` python fibo.py ``` 模块里的代码会被执行,就好像你导入了模块一样,但是 `__name__ `被赋值为` "__main__"`。 这意味着通过在你的模块末尾添加这些代码: ```py if __name__ == "__main__": import sys fib(int(sys.argv[1])) ``` ## 模块搜索路径 当一个名为 spam 的模块被导入的时候,解释器首先寻找具有该名称的内置模块。如果没有找到,然后解释器从 sys.path 变量给出的目录列表里寻找名为 spam.py 的文件。sys.path 初始有这些目录地址: * 包含输入脚本的目录(或者未指定文件时的当前目录)。 * PYTHONPATH (一个包含目录名称的列表,它和shell变量 PATH 有一样的语法)。 * 取决于安装的默认设置 ## 编译过的Python文件 为了加速模块载入,Python在 __pycache__ 目录里缓存了每个模块的编译后版本,名称为 module.version.pyc ,其中名称中的版本字段对编译文件的格式进行编码; 它一般使用Python版本号。 ## 标准模块 Python附带了一个标准模块库,在单独的文档Python库参考(以下称为“库参考”)中进行了描述。一些模块内置于解释器中;它们提供对不属于语言核心但仍然内置的操作的访问,以提高效率或提供对系统调用等操作系统原语的访问。这些模块的集合是一个配置选项,它也取决于底层平台。 ## dir() 函数 内置函数 dir() 用于查找模块定义的名称。 它返回一个排序过的字符串列表: ```py >>> >>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] ``` ## 包 包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法。 例如,模块名 A.B 表示 A 包中名为 B 的子模块。正如模块的使用使得不同模块的作者不必担心彼此的全局变量名称一样,使用加点的模块名可以使得 NumPy 或 Pillow 等多模块软件包的作者不必担心彼此的模块名称一样。 ``` sound/ Top-level package __init__.py Initialize the sound package formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ... ```