
本文共 4542 字,大约阅读时间需要 15 分钟。
本篇梳理python3中模块和包的使用细节。
目录
欢迎微信随缘关注@
1.模块
python模块是一个包含Python定义和语句的文件(就是一个.py结尾的脚本文件);
文件名为模块名,文件后缀为 .py;
在一个模块内部,模块名可以通过 __name__方法获得。
-
定义模块
定义一个模块fibo,即创建一个fibo.py文件。
#fibo.py
# Fibonacci numbers moduledef 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 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 moduledef 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 resultif __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/pythonimport syssys.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.包
,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)
3.参考资料
欢迎微信随缘关注@
发表评论
最新留言
关于作者
