九、模块与包
1. 模块
一个
.py
文件就是一个模块。在一个模块内部,模块名可以通过全局变量__name__
的值获得。模块化优点:①方便开发 ②方便维护 ③模块可以复用
比如,创建一个fibo.py
的模块:
# fibo.py
def fibo1(n):
a, b = 0, 1
for x in range(n):
print(a, end=' ')
a, b = b, a + b
print()
def fibo2(n):
a, b = 0, 1
for x in range(n):
print(a, end='--')
a, b = b, a + b
print()
在新的页面调用模块:
# fibo_test.py
import fibo
fibo1.fibo(9)
print(fibo.__name__)
执行效果:
import
语句还有一个变体:
from fibo import fibo1, fibo2
fibo1(9)
fibo2(9)
这样不会把被调模块名引入到局部变量表里,比如此处的
fibo
变量是未定义的。
还可以直接导入模块内所有名称:
from fib import *
这会调入所有非以下划线(
_
)开头的名称。注意通常情况下从一个模块或者包内调入
*
的做法是不太被接受的, 因为这通常会导致代码的可读性很差 , 因为它在解释器中引入了一组未知的名称,而它们很可能会覆盖一些你已经定义过的东西。
还可以在模块之后使用as
将名称绑定引入的模块:
import fibo as fb
from fibo import fibo1, fibo2 as fb
2. 主模块和非主模块
在 Python 函数中,如果一个函数调用了其他函数完成一项功能,我们称这个函数为主函数,如果一个函数没有调用其他函数,我们称这种函数为非主函数。主模块和非主模块的定义也类似,如果一个模块被直接使用,而没有被别人调用,我们称这个模块为主模块,如果一个模块被别人调用,我们称这个模块为非主模块。
__name__
属性:
如上面所提到的:__name__
属性可以获取模块的名称,但是也可以利用这个属性来判断是否为主模块:
if __name__ == '__main__':
print('当前为主模块')
当
__name__
属性值为__main__
时,当前模块为主模块,此处可执行不想被其他模块引用的操作
dir()
函数:
import fibo,sys
print(dir(fibo))
print(dir(sys))
执行效果:
内置函数
dir()
用于查找模块定义的名称。 它返回一个排序过的字符串列表。它会列出所有类型的名称:变量,模块,函数,等等
3. 包
包是一种通过用 “带点号的模块名” 来构造 Python 模块命名空间的方法
模块
fibo.py
在包com.slmd.py
下。每个包下都会有一个
__init__.py
文件,因为这个文件是必须的,否则,Python 就把这个目录当成普通目录,而不是一个包 。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它对应的模块名就是它的包名。
调用fibo.py
模块:
import com.slmd.py.fibo as fb
import com.slmd.py as fibo
from com.slmd.py.fibo import fibo as fibo1
fb.fibo(9)
fibo.fibo.fibo(9)
fibo1(9)
执行效果:
包支持
__path__
属性, 它被初始化为一个列表,其中包含在执行该文件中的代码之前保存包的文件__init__.py
的目录的名称。这个变量可以修改;这样做会影响将来对包中包含的模块和子包的搜索。
4. 作用域
以
_
为前缀命名的函数或变量都是非公开的(private),只能在模块内部访问,在通过from ... import *
引入时,不会引入_
下划线开头的变量
5. Python标准库
sys
模块:提供了一些变量和函数,使我们可以获取python解析器的信息,或通过函数来操作python解析器。官方文档
# 引入sys模块
import sys
# sys.argv
# 获取执行代码时,命令行(python命令)中所包含的参数。该属性是一个list,保存了当前命令所有参数
print(sys.argv)
# sys.modules
# 获取当前程序中引入的所有模块,返回一个dict,key是模块的名字,value是模块的对象
print(sys.modules)
# pprint模块提供的pprint()方法对打印的数据做简单的格式化
from pprint import pprint
pprint(sys.modules)
# sys.path
# 返回一个list,保存模块搜索的路径
pprint(sys.path)
# sys.platform
# 表示当前python运行的平台
print(sys.platform)
# sys.exit()
# 用于退出程序
sys.exit('程序已退出')
# os模块让我们可以对操作系统进行访问
import os
# os.environ
# 可以获取系统的环境变量
print(os.environ['path'])
# os.system()
# 可以用来执行操作系统的命令
os.system('notepad') # 打开记事本