View on GitHub

personal-study-nodes

个人学习过程中整理的一些笔记

九、模块与包

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__属性可以获取模块的名称,但是也可以利用这个属性来判断是否为主模块:

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')	# 打开记事本