本篇详解python中模块和包(库)的构建及使用。
首发于本人公众号:pythonic生物人
更好的阅读体验请戳:
本文您将学到什么?
1.模块
定义模块
导入模块
调用模块中函数
方法1 模块名.函数名
方法2 from 模块名 import 函数名1.函数名2,..
方法3 from 模块名 import *
给模块取个别名
给模块中函数取个别名
以脚本的方式执行模块
__name__怎么理解
查看模块中的属性:dir函数
导入模块时sys.path怎么理解
2.包
建立一个包
包中__init__.py文件作用
从包中导入单个模块
方法1
方法2
从包中导入所有模块
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)
参考资料
https://docs.python.org/zh-cn/3.8/library/__main__.html?highlight=__main__#module-__main__
https://www.zhihu.com/question/49136398
https://blog.konghy.cn/2017/04/24/python-entry-program/
https://docs.python.org/zh-cn/3/tutorial/modules.html
欢迎关注公众号:pythonic生物人
干货,真香
网友评论