第十一章:模块
11.1 什么是模块?
模块就像 一个装满工具的箱子,每个模块都包含了一组相关的函数、类和变量,可以帮助我们组织代码,实现代码的复用。Python中的模块实际上就是一个.py文件。
# 使用内置math模块。
import math;
# 使用math模块中的函数。
print(math.sqrt(16)); # 4.0。
print(math.pi); # 3.141592653589793。
11.2 为什么使用模块?
11.2.1 代码组织
模块帮助我们将代码分成逻辑单元:
my_project/
├── main.py
├── utils/
│ ├── __init__.py
│ ├── file_utils.py
│ └── math_utils.py
└── models/
├── __init__.py
├── user.py
└── product.py
11.2.2 代码复用
避免重复编写相同的代码:
# 在不同项目中重用工具函数
from utils.math_utils import calculate_average
scores = [85, 92, 78, 90, 88]
average = calculate_average(scores)
print(f"平均分:{average}")
11.2.3 命名空间管理
避免命名冲突:
import math
import statistics
# 不同模块可以有相同名称的函数
math.mean([1, 2, 3]) # math模块的mean函数
statistics.mean([1, 2, 3]) # statistics模块的mean函数
11.3 导入模块的方式
11.3.1 基本导入
# 导入整个模块。
import math;
print(math.sqrt(25));
# 导入模块并指定别名。
import math as m;
print(m.sqrt(25));
# 导入特定函数/类。
from math import sqrt, pi;
print(sqrt(25));
print(pi);
# 导入所有内容(不推荐,可能导致命名冲突)。
from math import *;
print(sqrt(25));
运行结果:
5.0
5.0
5.0
3.141592653589793
5.0
11.3.2 相对导入(在包内部)
在包内部的模块中使用相对导入:
# 在 utils/math_utils.py 中
from . import file_utils # 导入同级的file_utils模块
from ..models import user # 导入上级models包中的user模块
11.4 Python标准库常用模块
11.4.1 math - 数学运算
import math
# 基本数学函数
print(math.ceil(4.2)) # 5 - 向上取整
print(math.floor(4.8)) # 4 - 向下取整
print(math.fabs(-5)) # 5.0 - 绝对值
print(math.factorial(5)) # 120 - 阶乘
# 幂和对数
print(math.pow(2, 3)) # 8.0 - 幂运算
print(math.sqrt(16)) # 4.0 - 平方根
print(math.log(100, 10)) # 2.0 - 对数
# 三角函数
print(math.sin(math.pi/2)) # 1.0
print(math.cos(math.pi)) # -1.0
# 常数
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
11.4.2 random - 随机数
import random
# 生成随机数
print(random.random()) # 0.0到1.0之间的随机浮点数
print(random.uniform(1, 10)) # 1到10之间的随机浮点数
print(random.randint(1, 6)) # 1到6之间的随机整数(包括6)
# 序列操作
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print(random.choice(fruits)) # 随机选择一个元素
print(random.sample(fruits, 2)) # 随机选择2个不重复的元素
random.shuffle(fruits) # 打乱序列顺序
print(fruits)
11.4.3 datetime - 日期时间
import datetime
# 获取当前时间
now = datetime.datetime.now()
print(f"当前时间:{now}")
print(f"年份:{now.year}")
print(f"月份:{now.month}")
print(f"日期:{now.day}")
# 创建特定日期
birthday = datetime.datetime(1990, 5, 15)
print(f"生日:{birthday}")
# 时间计算
tomorrow = now + datetime.timedelta(days=1)
print(f"明天:{tomorrow}")
# 日期格式化
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化时间:{formatted}")
# 字符串转日期
date_str = "2023-12-25"
christmas = datetime.datetime.strptime(date_str, "%Y-%m-%d")
print(f"圣诞节:{christmas}")
11.4.4 os - 操作系统接口
import os
# 文件和目录操作
print(os.getcwd()) # 获取当前工作目录
# 创建目录
os.makedirs("my_folder/sub_folder", exist_ok=True)
# 列出目录内容
print(os.listdir(".")) # 当前目录内容
# 检查路径是否存在
print(os.path.exists("my_folder")) # True
# 路径操作
file_path = os.path.join("my_folder", "sub_folder", "file.txt")
print(f"文件路径:{file_path}")
# 环境变量
print(os.environ.get("PATH", "未找到PATH环境变量"))
11.4.5 sys - 系统相关参数
import sys
# 命令行参数
print(f"脚本名称:{sys.argv[0]}")
print(f"参数列表:{sys.argv[1:]}")
# Python解释器信息
print(f"Python版本:{sys.version}")
print(f"平台:{sys.platform}")
# 退出程序
if len(sys.argv) < 2:
print("需要提供参数")
sys.exit(1) # 非零退出码表示错误
# 模块搜索路径
print("模块搜索路径:")
for path in sys.path:
print(f" {path}")
11.4.6 json - JSON数据处理
import json
# Python对象转JSON字符串
data = {
"name": "张三",
"age": 25,
"courses": ["数学", "英语", "编程"],
"is_student": True
}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_str)
# JSON字符串转Python对象
parsed_data = json.loads(json_str)
print(f"姓名:{parsed_data['name']}")
# 读写JSON文件
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open("data.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print(f"从文件加载:{loaded_data['name']}")
11.5 创建自己的模块
11.5.1 创建简单模块
创建一个名为 my_math.py 的文件:
# my_math.py
"""一个简单的数学工具模块"""
def add(a, b):
"""计算两个数的和"""
return a + b
def multiply(a, b):
"""计算两个数的积"""
return a * b
def factorial(n):
"""计算阶乘"""
if n == 0:
return 1
result = 1
for i in range(1, n + 1):
result *= i
return result
# 模块级别的常量
PI = 3.14159
VERSION = "1.0.0"
在其他文件中使用这个模块:
# main.py
import my_math
print(my_math.add(5, 3)) # 8
print(my_math.multiply(4, 6)) # 24
print(my_math.factorial(5)) # 120
print(my_math.PI) # 3.14159
11.5.2 创建包
包是包含多个模块的目录,需要包含 __init__.py 文件:
my_package/
├── __init__.py
├── math_utils.py
└── string_utils.py
__init__.py 文件可以是空文件,也可以包含初始化代码:
# my_package/__init__.py
"""我的工具包"""
from .math_utils import add, multiply
from .string_utils import reverse_string
__version__ = "1.0.0"
__all__ = ['add', 'multiply', 'reverse_string']
11.6 模块的搜索路径
Python按照以下顺序搜索模块:
- 当前目录
- 环境变量PYTHONPATH指定的目录
- Python标准库目录
- 第三方库目录(site-packages)
import sys
# 查看模块搜索路径
for path in sys.path:
print(path)
# 添加自定义路径
sys.path.append("/path/to/my/modules")
本章笔记:
- 模块是组织Python代码的基本单位,通常是一个.py文件。
- 使用模块可以提高代码的可维护性、可重用性和可读性。
- Python有多种导入模块的方式:import、from...import、别名导入等。
- Python标准库提供了丰富的模块,如math、random、datetime、os等。
- 可以创建自己的模块和包来组织代码。
- 模块搜索路径决定了Python如何找到要导入的模块。