模块
# 模块
在项目目录下创建 fibo.py
;在模块内部,通过全局变量 __name__
可以获取模块名(即字符串)
# 斐波那契数列模块
def fib(n): # 打印斐波那契数列直到 n
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
def fib2(n): # 返回斐波那契数列直到 n
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a+b
return result
在当前目录,运行 Python 解释器:
>>> import fibo
>>> 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'
# 如果经常使用某个函数,可以把它赋值给局部变量:
>>> ffib = fibo.fib
>>> ffib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 引入模块
# 从fibo模块引入fib, fib2方法
>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 从fibo模块引入所有方法;
# 这种方式会导入所有不以下划线(_)开头的名称。大多数情况下,不要用这个功能
>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 模块别名
>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 方法别名
>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
# 脚本方式执行模块
python fibo.py <arguments>
这种方式执行模块代码时,在模块中读取到的 __name__
变量为 __main__
,因此可在模块末尾添加:
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
这样,这个文件既能被用作脚本,又能被用作一个可供导入的模块
python fibo.py 50
0 1 1 2 3 5 8 13 21 34
# 引入搜索机制
当导入一个名为 spam
的模块时
- 搜索内置模块(内置模块查看
sys.builtin_module_names
)- 搜索
sys.path
给出的路径列表下,因此需找spam.py
文件,路径包括:- 命令行直接运行的脚本所在的目录
PYTHONPATH
(目录列表,与 shell 变量 PATH 的语法一样)。- 依赖于安装的默认值(按照惯例包括一个 site-packages 目录,由 site 模块处理)
- 搜索
# 标准模块
略
# dir () 函数
内置函数 dir()
(opens new window) 用于查找模块定义的名称。返回结果是经过排序的字符串列表:
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
# 没有参数时,dir() 列出当前已定义的名称:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
# 包
包是通过使用 “带点号模块名” 来构造 Python 模块命名空间的一种方式。
例如,模块名 A.B
表示名为 A
的包中名为 B
的子模块。
sound/ 最高层级的包
__init__.py 初始化 sound 包
formats/ 用于文件格式转换的子包
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 用于音效的子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ 用于过滤器的子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
需要有
__init__.py
文件才能让 Python 将包含该文件的目录当作包来处理(除非使用 namespace package (opens new window),这是一个相对高级的特性)。 这可以防止重名的目录如string
在无意中屏蔽后继出现在模块搜索路径中的有效模块。在最简单的情况下,
__init__.py
可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__
变量,这将在稍后详细描述。
# 包中导入单个模块
import sound.effects.echo
# 必须通过其全名来引用
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
# 引入effects包下的echo模块
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
# 引入echo模块下的echofilter方法
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
# 相对导入
from . import echo
from .. import formats
from ..filters import equalizer
上次更新: 2024/10/11, 11:33:07