点击跳转
《Python入门系列目录》
文章目录
1. 模块
1.1 模块的概念
- 如果程序中包含多个可以复用的函数或类,则通常把相关的函数和类分组包含在单独的模块(module)中
- 这些提供计算功能的模块称之为模块(或函数模块)
- 导入并使用这些模块的程序,称之为客户端程序
1.2 模块化编程
- 把计算任务分离成不同模块的程序设计方法,称之为模块化编程(modular programming)
- 模块化程序设计的优越性
- 可以编写大规模的系统程序
- 控制程序的复杂度
- 实现代码重用
- 增强可维护性
1.3 创建模块
-
在模块中,除了可以定义变量、函数和类之外,还可以包含一般的语句,称之为主块(全局语句)
-
当运行该模块,或导入该模块时,主块语句将依次执行
# 创建模块my_math1.py,定义算术四则运算 PI = 3.14 # 定义常量 # 定义函数:加 def add(x, y): return x + y # 定义函数:减 def sub(x, y): return x - y # 定义函数:乘 def mul(x, y): return x * y # 定义函数:除 def div(x, y): return x / y
1.4 模块的私有函数
-
实现模块时,有时候需要在模块中定义仅在模块中使用的辅助函数。辅助函数不提供给客户端直接调用,故称之为私有函数
-
私有函数客户端不应该直接调用
-
Python语言没有强制不允许调用私有函数的机制,程序员应该避免直接调用私有函数
# 创建模块normal1.py,实现正态分布的概率密度函数PDF import math def _phi(x): return math.exp(-x * x / 2.0) / math.sqrt(2 * math.pi) def pdf(x, mu=0.0, sigma=1.0): return _phi(float((x - mu) / sigma)) / sigma # 测试代码 if __name__ == '__main__': # 如果独立运行时,则执行测试代码 for i in range(0, 101): print(i, pdf(i, mu=78, sigma=10))
1.5 模块的测试代码
-
每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称
-
特别地,当一个模块被用户单独运行时,其_name__的值为’_main’
-
可以把模块源代码文件的测试代码写在相应的测试判断中,以保证只有单独运行时,才会运行测试代码
# 创建模块my_math1.py,定义算术四则运算 PI = 3.14 # 定义常量 # 定义函数:加 def add(x, y): return x + y # 定义函数:减 def sub(x, y): return x - y # 定义函数:乘 def mul(x, y): return x * y # 定义函数:除 def div(x, y): return x / y def main(): print('123 + 456 =', add(123, 456)) print('123 - 456 =', sub(123, 456)) print('123 * 456 =', mul(123, 456)) print('123 / 456 =', div(123, 456)) # 测试代码 if __name__ == '__main__': main()
1.6 模块的导入和使用
- 使用import语句可以导入模块
- import 模块名
- import 模块1, 模块2, …, 模块n
- import 模块名 as 模块别名
- 导入模块后,可以使用全限定名称访问模块中定义的成员
- 模块名.函数名
- 模块名.变量名
- from … import … 语句
- 使用from … import … 语句直接导入模块中的成员
- from 模块名 import 成员名
- 调用时:成员名
- 使用from … import … 语句直接导入模块中的成员
- 如果希望同时导入一个模块中的多个成员,可以采用下列形式
- from 模块名 import 成员名1, 成员名2, …, 成员名n
- 如果希望同时导入一个模块中的所有成员,可以采用下列形式
- from 模块名 import *
- 调用时:成员名
- from 模块名 import *
1.7 模块的导入顺序
-
导入模块时,解释器按下列目录搜索路径和文件搜索顺序查找并导入文件
- 当前目录
- 启动交互式Python的目录,或Python主程序位于的目录
- 操作系统环境变量PYTHONPATH中指定的目录
- 当前目录
-
Python标准库目录
-
一旦确定了所在目录,不能再向上查找目录
- 比如自己重写的math模块,如果导入后用标准库中的math模块,将报错
1.8 dir()内置函数
- 模块中定义的成员,包括变量、函数和类,可以通过内置的函数dir()查询,也可以通过help()函数查询其帮助信息
- dir()
- 不带参数,列举当前模块的所有成员
- dir(模块名)
- 列举指定模块的所有成员
- dir(类/对象)
- 列举指定类的所有成员
- 注意:Python所有的成员都是对象
- 例如:dir(str)
- dir()
1.9 名称空间
- Python中,每一个名称(变量名、函数名或类型名)都有一个作用范围,这个作用范围称为名称空间,也称为命名空间
1.10 名称查找顺序
- 当代码中使用名称x时,Python解释器把x解释为对象名(对象、函数、变量等),并按如下名称空间顺序查找以x命名的对象
- 局部名称空间
- 当前函数或类的方法中定义的局部变量
- 全局名称空间
- 当前的模块(.py文件)中定义的变量、函数或类
- 内置名称空间
- 对每个模块都是全局的。作为最后的尝试,Python将假设x是内置函数或变量
- 局部名称空间
1.11 顶层模块
-
Python程序通常由多个模块组成,其中一个模块作为包含应用程序的启动代码,这个模块称为顶层模块
-
其他模块叫库模块
-
使用Python解释器进行交互式执行Python代码时,Python解释器是顶层模块,其中定义的名称是全局变量,属于全局名称空间
-
Python使用特殊变量__name__来标记一个模块是否是顶层模块
- 如果模块是作为一个正在运行的顶层模块,则该变量名为字符串_main_
- 如果模块被另一个模块(不管是顶层模块或其他模块)导入,则该变量名为模块的名称
-
因此,在模块中编写仅当作为顶层模块运行时才被执行的代码时,可以使用下列语句
if __name__ == '__main__':
2. 包
2.1 包的概念
- 包是文件夹
- 通常,只要文件夹中包含一个特殊的文件_init_.py,则Python解释器就将该文件夹作为包,其中的模块文件属于包中的模块
- 特殊文件_init_.py可以为空,也可以包含属于包的代码,当导入包或该包中的模块时,执行该py文件
- 包可以包含子包,没有层次限制
- 使用包可以有效避免名称空间冲突
2.2 创建包
- 在指定目录中创建对应包名的目录
- 在该目录下创建一个特殊文件:_init_.py文件
- 最后在该目录下创建模块文件
2.3 包的导入和使用
-
至少精确到模块名,而不是包名
-
import [包名1.[包名2.[…]]].模块名
- 调用时:[包名1.[包名2.[…]]].模块名.成员名
-
from [包名1.[包名2.[…]]].模块名 import 成员名
- 调用时:成员名
-
from [包名1.[包名2.[…]]] import 模块名
- 调用时:模块名.成员名