" 尽管记忆再悲伤、我却笑着、不愿遗忘 "
前言
- 两种运行 Python 代码的方式
- 一种是解释器的交互模式、另一种是直接运行 Python 代码文件
- 在 Python 中、每一个 Python 代码文件就是一个模块
- 写程序时、我们可以将代码分散在不同的模块(文件)中、然后在一个模块里引用另一个模块的内容
1、模块
1.1、模块的导入
# 在一个模块中引用(导入)另一个模块、可以使用 import 语句
# 这里的模块名是除去 .py 后缀的文件名称
# 如想要导入模块 abc.py、只需 import abc
import 模块名
# import 模块之后、就可以使用被导入模块中的名字(变量、函数类)
模块名.变量
模块名.函数
模块名.类
%1 在同一个目录下创建两个模块(二个文件)
salary_worker # 目录名
|___salary.py # 文件名
|___worker.py # 文件名
# 第一个模块名为 salary.py
# salary1 用来保存开始的薪水、将在函数 harvest() 中使用
# random.randint(1, 9)、随机生成 1~9 中的一个数
# salary1 * 数字 得到不断努力后返回的工资
import random
salary1 = 100
def harvest():
return salary1 * random.randint(1, 9)
# 第二个模块名为 worker.py
# 第一行用 import salary将 salary.py 模块导入进来
#(使用 import 导入时不需要写 .py 后缀)
# 导入 salary 模块后、就可以使用其中的变量和函数了
# 将 salary.salary1 设置为 200
# 调用 salary.harvest() 来得出总工资
import salary
print('我有工资了')
salary.salary1 = 200
print('不断努力')
salary = salary.harvest()
print(salary)
# 执行模块 worker.py
# output:我有工资了
# 不断努力
# 200~400~600~...~1800的数(间隔200)
1.2、标准库模块的导入
- 我们自己定义了模块、然后在其它模块中使用它
- 其中有个地方不知道你有没有注意到
- salary.py 的第一行代码是 import random
- random 并不是我们所定义的模块
# random 是标准库中的一个模块
# 标准库是由 Python 官方开发的代码库、和解释器一起打包分发
# 其中包含非常多实用的模块、我们在使用时直接 import 进来即可
import random
a = random.randint(1,9)
# 用来产生1~8之间的随机数
print(a)
# output:6
1.3、执行模块时传入参数
# 在Python交互环境中、用这种方式来执行模块
python3 模块文件名
# 我们还可以进一步将参数传递到模块中去
python3 模块文件名 参数1 ...参数n
# 参数传递到模块中以后、我们可以通过 sys 模块来取出这些参数
# 参数放在 sys.argv 列表中
# 首先需要导入 sys 模块、这是个标准库中的模块
# sys.argv 是个列表、执行模块时被传递进来的参数保存在其中
# 它的列表项分别为:
# sys.argv[0] 保存当前被执行模块的文件名
# sys.argv[1] 保存第 1 个参数
# sys.argv[2] 保存第 2 个参数
# 依次类推
import sys
模块文件名 = sys.argv[0]
参数1 = sys.argv[1]
参数N = sys.argv[N]
%1 修改之前的worker.py代码
# 第二个模块名为 worker.py
# 第一行用 import salary将 salary.py 模块导入进来
#(使用 import 导入时不需要写 .py 后缀)
# 导入 salary 模块后、就可以使用其中的变量和函数了
# 将 salary.salary1 设置为 200
# 调用 salary.harvest() 来得出总工资
import salary
import sys
print('我有工资了')
salary.salary1 = sys.argv[1]
print('不断努力')
salary = salary.harvest()
print(salary)
# 执行模块 worker.py 400
# output:我有工资了
# 不断努力
# 400~800~1200~...~3200的数(间隔400)
#在这个例子中 sys.argv 的值是:
# sys.argv[0]: worker.py
# sys.argv[1]: 400
2、包
2.1、什么是包
- 之前我们将定义的两个模块放在同一目录下
- 然后通过 import 语句来相互引用
- 这是一种扁平的模块组织结构
- 当模块数量很大的时候就很不灵活了、也难以维护
- Python 中可以用文件树这样的树形结构来组织模块
- 这种组织形式下的模块集合称为包(Package)
# 语法
包/
├── __init__.py
├── 模块1.py
├── 模块2.py
├── 子包1/
├── __init__.py
├── 模块3.py
└── 模块4.py
└── 子包2/
├── __init__.py
├── 模块5.py
└── 孙子包1/
├── __init__.py
└── 模块6.py
# 这是个很明显的层级结构
# 包里面包含子包、子包包含孙子包...
# 单独将子包或孙子包拿出来、它们也是包
# 包的存在形式是目录、模块的存在形式是目录下的文件
# 所以我们可以很容易地构造出这样一个包
# 只要在文件系统中创建相应的目录和文件即可
# 需要注意的是、每个层级的包下都需要有一个 __init__.py 模块
# 这是因为只有当目录中存在 __init__.py 时、Python 才会把这个目录当作包
2.2、包的导入
# 语法
# 从最顶层的包开始依次向下引用子包、直至目标模块
import 包.子包.模块
# 从上面示例的包结构中
# 导入 模块1.py
import 包.模块1
# 导入 模块3.py
import 包.子包1.模块3
# 导入 模块6.py
import 包.子包2.孙子包1.模块6
3、模块和包存在的必要性
- 模块的存在是为了更好的组织代码
- 将不同功能的代码分散在不同模块中
- 清晰地划分出各个模块的职责、有利于使用和维护代码
- 同时也可避免模块中的内容过长
- 包的存在是为了更好的组织模块
- 与模块同理、包在更高的抽象层次上组织着代码
4、总结
-
模块可以更好的组织代码、它的存在形式是文件
-
包的可以更好的组织模块、它的存在形式是目录
# 导入模块使用 import 语句
import 模块名
# 导入包下的模块
import 包名.模块名
# 模块导入后、可以使用该模块中所定义的名字(变量、函数类)
模块名.变量
模块名.函数
模块名.类