初学者必看的Python模块讲解
模块
如果你从 Python 解释器退出并进入,您的定义(函数和变量)将消失。因此,如果你想写一些更长的程序,你最好使用一个文本编辑器来准备输入解释器,然后使用这个文件作为输入来操作程序。这也被称为创建一个脚本。当你的程序变长时,你可能想把它分成几个文件来管理它。你也可能想直接在几个程序中使用函数,而不是在每个程序中复制函数定义。
为支持这一特性,Python 将定义放入文件中,然后在脚本或交互式解释器实例中使用。该文件称为模块 (module),模块中的定义可以导入到其他模块或主模块中(可以访问的变量集合可以在顶层和计算器模式下执行的脚本中)。
一个模块是一个包含 Python 定义和声明文件。文件是模块名加上.py后缀。在模块中,模块名(字符串类型)可以通过全局变量__name__获取。例如,使用您最喜欢的文本编辑器在当前目录下创建一个名为fibo的文本编辑器.py文件包含以下内容
#斐波那契数模块 deffib(n):#印刷斐波那契直到n a,b=0,1 whilea<n: print(a,end='') a,b=b,a+b print() deffib2(n):#返回n的斐波那契数 result=[] a,b=0,1 whilea<n: result.append(a) a,b=b,a+b returnresult
现在进入 Python 解释器通过下面的命令导入该模块
>>>importfibo
在当前环境下,fibo中定义的函数名不会直接导入,只会导入名为fibo的模块。模块中定义的函数可以通过使用模块名获得:
>>>fibo.fib(1000) 01123581321345589144233377610987 >>>fibo.fib2(100) 1、1、2、3、5、8、13、24、55、89 >>>fibo.__name__ 'fibo'
如果你打算经常使用一个函数,你可以给它一个局部变量
>>>fib=fibo.fib >>>fib(500) 01123581321345589144233377
模块进阶
一个模块可以包含可执行的声明,包括函数定义。这些声明用于初始化模块。它们只在模块中 第一 二次导入时执行。 [1](如果文件作为脚本运行,它们也将被执行)
每个模块都有自己的私有符号表,模块中定义的所有函数都将该符号表作为全球符号表。因此,模块的作者可以在不担心与其他模块的所有变量冲突的情况下,在模块中使用全球变量。另一方面,如果你知道你在做什么,你也可以使用它 模块.变量 获取一个模块的全局变量的方法。
所有模块都可以导入其他模块。 import 在模块(或脚本,如果这个问题很重要)的开头不是必要的,但习惯了。导入的模块名被放置在当前模块的全局符号表中。
import 声明的变体可以将模块中的变量直接导入当前模块的符号表。例如:
>>>fromfiboimportfib,fib2 >>>fib(500) 01123581321345589144233377
这样做不会在本地符号表中引入模块名(所以在上面的例子中,fibo没有定义)
导入声明的另一个变体可以导入模块中定义的所有变量:
>>>fromfiboimport* >>>fib(500) 01123581321345589144233377
除以下划线(_)开头的所有名称外,还将导入模块。在大多数情况下, Python 程序员不使用这种机制,因为它会在解释器中引入一系列未知的位置变量,这可能会覆盖你已经定义的一些变量。
请注意,一般来说,使用 import * 导入模块或包并不流行,因为它通常会降低代码的可读性。但允许使用交互式解释器来减少打字。
假如模块名后跟着 as, 那么 as 后变量名将与导入的模块名绑定。
>>>importfiboasfib >>>fib.fib(500) 01123581321345589144233377
这与import有关 除了模块现在被命名为fib而不是fibo外,fibo的导入方式也是如此。
这种机制在使用from时可以达到相同的效果:
模块搜索路径
当一个名为 spam 当导入模块时,解释器首先寻找同名内部建筑模块。如果没有发现同名内部建筑模块,解释器将根据 sys.path 在提供的一系列路径下寻找名称 spam.py 的文件。sys.path 根据以下位置进行初始化:
包含输入脚本的目录(如果没有指定文件,则为当前目录)
PYTHONPATH 目录列表、语法和 shell 的 PATH 变量相同。
依靠默认路径进行安装。