模块
如果退出Python解释器并再次进入,那么所做的定义(函数和变量)将丢失。因此,如果想编写更长的程序,最好使用文本编辑器为解释器准备输入,并将该文件作为输入,这称为创建脚本。随着程序越来越长,可能希望将其拆分为多个文件以便于维护。您可能还希望在多个程序中使用编写的方便函数,而无需将其定义复制到每个程序中。
为了支持这一点,Python 可以将定义放入文件中,并在脚本或解释器的交互式实例中使用它们。这样的文件称为模块;模块中的定义可以导入到其他模块或主模块。
模块是包含 Python 定义和语句的文件。文件名是附加 .py 后缀的模块名。在模块中,模块的名称(字符串)可作为全局变量 __name__ 的值。例如,使用文本编辑器在当前目录中创建名为 fibo.py 的文件,其中包含以下内容:
# Fibonacci 模块
def fib(n): # 将 Fibonacci 序列写到 n
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
def fib2(n): # 返回到 n 的 Fibonacci 序列
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a+b
return result
fib(11)
print(fib2(12))
复制
运行结果:
0 1 1 2 3 5 8
[0, 1, 1, 2, 3, 5, 8]
复制
现在进入 Python 解释器并使用以下命令导入此模块:
import fibo
复制
这不会在当前符号表中直接输入 fibo 中定义的函数名称;它只输入模块名 fibo。使用模块名称,可以访问以下函数:
fibo.fib(100)
print(fibo.fib2(100))
print(fibo.__name__)
复制
如果要经常使用函数,可以将其指定给局部变量:
fib = fibo.fib
fib(500)
复制
运行结果:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
复制
模块可以包含可执行语句以及函数定义。这些语句用于初始化模块。只有在 import 语句中第一次遇到模块名时,才会执行这些命令。(如果文件作为脚本执行,它们也会运行。)
每个模块都有自己的专属符号表,该表被模块中定义的所有函数用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量发生意外冲突。另一方面,如果您知道自己在做什么,可以使用用于引用其函数的相同表示法 modname.itemname 来访问模块的全局变量。
模块可以导入其他模块。通常将所有 import 语句放在模块(或脚本)的开头,但这不是必须的。导入的模块名称放置在导入模块的全局符号表中。
import 语句的一个变体是将名称从模块直接导入到导入模块的符号表中。例如:
from fibo import fib, fib2
fib(500)
复制
这不会在本地符号表中引入从中获取导入的模块名称(因此在本例中,未定义 fibo)。
甚至还有一个变体可以导入模块定义的所有名称:
from fibo import *
fib(500)
复制
这将导入所有名称,但以下划线 _ 开头的名称除外。在大多数情况下,Python 程序员不使用此功能,因为它向解释器中引入了一组未知的名称,可能会隐藏一些您已经定义的内容。
请注意,通常不建议从模块或包导入所有名称的做法,因为这通常会导致代码可读性差。但是,可以使用它在交互式会话中节省输入。
如果模块名称后面跟 as,则 as 后面的名称将直接绑定到导入的模块。
import fibo as abc
abc.fib(500)
复制
这是和 import fibo 以相同方式有效地导入模块,唯一的区别是它作为 fib 使用。
可以使用 from 达到类似效果时:
from fibo import fib as fibonacci
fibonacci(500)
复制
官方文档:
https://docs.python.org/3.9/tutorial/modules.html