共计 4326 个字符,预计需要花费 11 分钟才能阅读完成。
1. 模块
python 模块是一个蕴含 Python 定义和语句的文件(就是一个.py 结尾的脚本文件);
文件名为模块名,文件后缀为 .py;
在一个模块外部,模块名能够通过 __name__办法取得。
定义模块
定义一个模块 fibo,即创立一个 fibo.py 文件。#fibo.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 习惯上把所有 import 语句放在脚本的结尾,全局调用。
>>> import fibo# 导入模块 fibo
>>> fibo.__name__#__name__办法取得模块 fibo 的模块名
'fibo'
调用模块中函数
办法 1 模块名. 函数名
>>> import fibo
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
办法 2 from 模块名 import 函数名 1. 函数名 2,……….
>>> from fibo import fib,fib2# 多个函数名之间应用逗号隔开
>>> fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
办法 3 from 模块名 import *
* 示意该模块中所有的函数,会导致代码可读性差(不倡议应用)。
>>> from fibo import *
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
给模块取个别名
import 模块名 as 别名
>>> import fibo as fb
>>> fb.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
给模块中函数取个别名
from 模块名 import 函数名 as 函数别名
>>> from fibo import fib2 as fb2
>>> fb2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
以脚本的形式执行模块
fibo.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
if __name__ == "__main__":
print("当初该模块被当做脚本执行啦!")
print(("此时__name__ == %s"%(__name__)))# 此时模块的__name__为__main__
import sys
result = fib2(int(sys.argv[1]))
print(result)
python fibo.py 100#if name == “__main__”: 之后代码块执行了(罕用于测试)
当初该模块被当做脚本执行啦!
此时__name__ == main
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
__name__怎么了解
__name__是个全局变量,寄存模块的名字;
当该模块被其它模块调用时,__name__= 模块名,对于 fibo.py,__name__=”fibo”;
当该模块被当做执行脚本时,__name__为__main__(A module’s name is set equal to ‘__main__’ when read from standard input, a script, or from an interactive prompt)。
对于 fibo.py,如果终端执行 python fibo.py 100,if name == “__main__”: 前面代码会执行;如果在别的模块中执行 import fibo,,if name == “__main__”: 前面代码不会执行。
import fibo#if name == “__main__”: 之后代码块没执行 \
查看模块中的属性:dir 函数
>>> import fibo
>>> dir(fibo)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']
以__结尾和结尾的属性为 python 的内置属性;
‘fib’, ‘fib2’ 为自定义属性。
导入模块是 sys.path 怎么了解
sys.path 收集 python 模块的所有搜寻门路,能够本人增加搜寻门路(sys.path.append(‘yourpath’))举个栗子:
#test.py
#!/usr/bin/python
import sys
sys.path.append('~/biosoft/')
print(sys.path)
> python test.py
['/home/pylearning',
'/home/software/anaconda3/lib/python37.zip',
'/home/software/anaconda3/lib/python3.7',
'/home/.local/lib/python3.7/site-packages',
'/home/software/anaconda3/lib/python3.7/site-packages','~/biosoft/'
]
任何一个 python 程序执行时,会搜寻其导入模块的门路,先搜寻内置模块门路;
而后搜寻 sys.path 收集的门路,sys.path 中门路顺次为:
[‘/home/pylearning’, #被执行程序 test.py 所在门路 ’/home/software/anaconda3/lib/python37.zip’,’/home/software/anaconda3/lib/python3.7′, #环境变量 PYTHONPATH 中门路 ’/home/.local/lib/python3.7/site-packages’, #规范库门路 ’/home/software/anaconda3/lib/python3.7/site-packages’,#规范库门路 ’~/biosoft/’# 本人增加门路]
2. 包(库)
建设一个包
sound 包蕴含 formats,effects,filters 三个子包。
sound/ #Top-level package(顶层包 sound)__init__.py #该文件能够为空,只有该文件存在时 sound 才会被当做包而不是目录
formats/ #Subpackage(子包)__init__.py #同上,该文件存在时,formats 才会被当做包而不是目录
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
haha.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
haha.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
包中__init__.py 文件作用
只有目录中增加__init__.py 文件时,目录才会被当做包而不是目录;
__init__.py 能够为空;
__init__.py 中能够设置 __all__ 变量,这个变量次要影响包的导入
- 对于上文的 sound 包,sound/filters/__init__.py 中输出__all__ == [“equalizer”, “vocoder”]时,from sound.filters import * 时不会导入 karaoke 模块。
从包中导入单个模块
导入 sound 包中子包 effects 中的 echo 模块
办法 1
import sound.effects.echo 援用它时必须应用它的全名,sound.effects.echo(xxx)。
办法 2
from sound.effects import echo 援用办法,echo(xxx)
从包中导入所有模块
from sound.effects import * 援用办法,echo(xx)