Python 入门手札:从 0 到会--第九天Python的模块化编程--模块、包以及常见系统模块和第三方模块总结
目录
一、模块
1. 模块化编程(Modular Programming)
2. 什么是模块(Module)
3.模块的分类
3.1 内置模块(标准库模块)
3.1.1. 与操作系统交互
3.1.2. 文件与数据处理
3.1.3. 正则表达式与文本处理
3.1.4. 数学与随机数
3.1.5. 时间与日期
3.1.6. 数据结构与算法
3.1.7. 网络与服务
3.1.8. 异常与调试
3.2 第三方模块
3.2.1. 科学计算与数据分析
3.2.2. 机器学习与人工智能
3.2.3. 网络请求与解析
3.2.4. Web 开发框架
3.2.5. 数据库连接与 ORM
3.2.6. 自动化与办公
3.2.7. 虚拟环境与依赖管理
3.3 自定义模块
3.4 模块的导入方式
3.5 模块搜索路径
二、包
1. 什么是包
2. 包的特点
3. 包的目录结构示例
4. init.py 的作用
5. 子包的概念
6. 命名建议
7. 总结
三、模块和包的对比
1. 基本概念对比
2. 使用场景对比
四、导入
1. 导入模块的常用方式
2.模块搜索路径(sys.path)
3. 绝对导入与相对导入
4. 动态导入模块
5. 常见问题说明
6. 总结
一、模块
1. 模块化编程(Modular Programming)
模块化编程是一种将程序划分为多个功能独立、可重复使用模块的编程方式。
优点:
高复用性:模块可以在多个程序中重复使用。
高可维护性:模块之间低耦合,易于修改和调试。
高可读性:结构清晰,逻辑分明。
便于协作开发:可多人分别开发不同模块。
2. 什么是模块(Module)
模块是一个 Python 文件(
.py
),内部包含:
变量
函数
类
可执行代码等
例如:
# mymodule.py
def greet(name):return f"Hello, {name}"
3.模块的分类
3.1 内置模块(标准库模块)
Python 内置模块,安装 Python 时自动提供,无需单独安装,直接 import
即可使用。
3.1.1. 与操作系统交互
模块名 | 说明 |
---|---|
os | 与操作系统交互,如文件/目录操作 |
sys | 与 Python 解释器交互,如路径、参数等 |
shutil | 高级文件操作(复制、移动等) |
subprocess | 执行子进程和外部命令 |
os 模块示例:
#os 模块(与操作系统交互)
import os
# 获取当前工作目录
print("当前目录:", os.getcwd())
# 创建文件夹(如果不存在)
folder_name = "demo_folder"
if not os.path.exists(folder_name):os.mkdir(folder_name)
sys 模块示例:
#sys 模块(访问解释器参数)
import sys
# 获取命令行参数(启动时传入)
print("命令行参数:", sys.argv)
# 获取 Python 版本
print("Python 版本:", sys.version)
3.1.2. 文件与数据处理
模块名 | 说明 |
---|---|
json | 处理 JSON 数据 |
csv | 读写 CSV 文件 |
pickle | 对 Python 对象进行序列化/反序列化 |
io | 处理文件流和内存流 |
json模块示例:
#json 模块(处理 JSON 数据)
import json
data = {"name": "Alice", "age": 25}
json_str = json.dumps(data) # 转换为 JSON 字符串
print("JSON 字符串:", json_str)
# 解析 JSON 字符串为 Python 字典
parsed = json.loads(json_str)
print("解析后:", parsed["name"])
3.1.3. 正则表达式与文本处理
模块名 | 说明 |
---|---|
re | 正则表达式处理 |
string | 字符串常量和工具函数 |
textwrap | 文本换行和缩进处理 |
re 模块示例:
#re 模块(正则表达式)
import re
text = "邮箱是 test123@example.com"
pattern = r"\w+@\w+\.\w+"
match = re.search(pattern, text)
if match:print("找到邮箱:", match.group())
3.1.4. 数学与随机数
模块名 | 说明 |
---|---|
math | 提供数学函数,如三角函数、对数等 |
random | 生成随机数 |
decimal | 精确小数计算 |
fractions | 分数运算 |
math 模块示例:
#math 模块(数学运算)
import math
print("平方根:", math.sqrt(16))
print("向上取整:", math.ceil(3.2))
print("圆周率:", math.pi)
#random 模块(生成随机数)
import random
print("随机整数(1~10):", random.randint(1, 10))
print("随机选择:", random.choice(['apple', 'banana', 'cherry']))
3.1.5. 时间与日期
模块名 | 说明 |
---|---|
time | 时间戳、睡眠等 |
datetime | 日期时间处理 |
calendar | 日历相关处理 |
datetime 模块示例:
#datetime 模块(处理日期时间)
from datetime import datetime, timedelta
now = datetime.now()
print("当前时间:", now)
# 往前推 3 天
three_days_ago = now - timedelta(days=3)
print("三天前:", three_days_ago.strftime("%Y-%m-%d"))
3.1.6. 数据结构与算法
模块名 | 说明 |
---|---|
collections | 提供额外的数据结构,如deque 、Counter 等 |
heapq | 堆队列(优先队列) |
bisect | 二分查找与插入 |
itertools | 迭代器工具,如排列、组合等 |
functools | 函数工具,如缓存、偏函数等 |
3.1.7. 网络与服务
模块名 | 说明 |
---|---|
socket | 低层网络通信 |
http.server | 简单 HTTP 服务器 |
urllib | HTTP 请求处理 |
uuid | 生成唯一标识符 |
3.1.8. 异常与调试
模块名 | 说明 |
---|---|
logging | 日志系统 |
traceback | 错误追踪栈 |
warnings | 发出警告 |
assert (语法) | 条件断言 |
3.2 第三方模块
以下模块大多数通过 pip install 模块名
安装,适用于 Web 开发、数据处理、机器学习等领域。
3.2.1. 科学计算与数据分析
模块名 | 说明 |
---|---|
numpy | 数组与矩阵运算的核心库 |
pandas | 数据清洗与分析 |
scipy | 科学与工程计算 |
matplotlib | 绘图与可视化 |
seaborn | 高级统计图表库(基于 matplotlib) |
pandas 模块示例:
#pandas 模块(数据分析)
#需先安装:pip install pandas
import pandas as pd
# 创建 DataFrame
data = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
df = pd.DataFrame(data)
print("查看表格:")
print(df)
# 计算平均年龄
print("平均年龄:", df['age'].mean())
matplotlib 模块示例:
#matplotlib 模块(绘图)
#需先安装:pip install matplotlib
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [2, 4, 6, 8]
plt.plot(x, y)
plt.title("简单折线图")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.show()
3.2.2. 机器学习与人工智能
模块名 | 说明 |
---|---|
scikit-learn | 通用机器学习库 |
tensorflow | Google 提供的深度学习框架 |
torch (PyTorch) | Facebook 提供的深度学习框架 |
xgboost | 常用于比赛的梯度提升算法 |
3.2.3. 网络请求与解析
模块名 | 说明 |
---|---|
requests | 简单易用的 HTTP 客户端 |
httpx | 异步 HTTP 客户端 |
beautifulsoup4 | HTML/XML 解析库 |
lxml | 高性能 HTML/XML 解析库 |
selenium | 自动化浏览器操作 |
requests 模块示例:
#requests 模块(第三方模块,用于网络请求)
#需先安装:pip install requests
import requests
response = requests.get("https://api.github.com")
print("响应状态码:", response.status_code)
print("返回内容:", response.json())
3.2.4. Web 开发框架
模块名 | 说明 |
---|---|
flask | 轻量级 Web 框架 |
django | 全功能 Web 框架 |
fastapi | 异步、类型注解友好的新兴 Web 框架 |
3.2.5. 数据库连接与 ORM
模块名 | 说明 |
---|---|
sqlalchemy | 通用 ORM 工具 |
pymysql | MySQL 数据库驱动 |
psycopg2 | PostgreSQL 数据库驱动 |
3.2.6. 自动化与办公
模块名 | 说明 |
---|---|
openpyxl | 操作 Excel 文件(.xlsx) |
xlrd / xlwt | 读写旧版 Excel(.xls)文件 |
python-docx | 处理 Word 文件 |
pdfplumber | 提取 PDF 文本内容 |
pyautogui | 模拟鼠标键盘操作(自动化测试) |
3.2.7. 虚拟环境与依赖管理
模块名 | 说明 |
---|---|
virtualenv / venv | 创建虚拟环境 |
pipenv | 管理虚拟环境和依赖 |
poetry | 项目依赖与构建工具 |
3.3 自定义模块
自己创建的 .py
文件,用于组织代码,提高复用性。
创建模块 tools.py
:
def add(a, b):return a + b
使用模块:
import tools
print(tools.add(3, 5)) # 输出 8
跨文件夹使用
假设目录结构如下:
project/utils/__init__.pymath_utils.pymain.py
在main.py
中:
from utils.math_utils import add
print(add(3, 5)) # 输出: 8
3.4 模块的导入方式
import math # 导入整个模块
from math import sqrt # 导入模块中的某个函数
import numpy as np # 给模块起别名
from math import * # 导入所有内容(不推荐)
3.5 模块搜索路径
模块加载时,Python 按以下顺序查找模块:
-
当前目录
-
环境变量
PYTHONPATH
指定的目录 -
标准库目录
-
第三方库目录(如 site-packages)
查看路径:
import sys
print(sys.path)
二、包
1. 什么是包
包是组织 Python 模块的一种形式。它本质上是一个文件夹,用于管理多个相关模块。包中必须包含一个名为 __init__.py
的文件,这个文件可以为空,也可以包含包的初始化代码。
2. 包的特点
包是一个目录。
包中必须有
__init__.py
文件。包中可以包含模块文件(
.py
)或子包。使用包可以构建结构清晰的大型项目。
3. 包的目录结构示例
my_project/
├── main.py
└── my_package/├── __init__.py├── module1.py└── module2.py
说明:
-
my_package
是一个包 -
module1.py
和module2.py
是其中的模块 -
__init__.py
标识该目录为包
4. init.py 的作用
-
标识包目录: 告诉Python解释器当前目录应被视为一个包。
-
执行初始化代码: 可以包含任何代码,通常用于包的初始化操作,如变量初始化、导入模块等。这些代码在包被导入时执行。
-
控制包的导入行为: 通过
__all__
变量明确指定从包中可以导入哪些模块,从而限制包的公开接口。 -
提供包级别的命名空间:
__init__.py
中定义的变量和函数可以在包的模块中共享。 -
批量导入模块: 可以在
__init__.py
文件中批量导入模块,这些模块可以更方便地使用。
示例:
# __init__.py 文件示例
# 1. 批量导入系统模块
import os
import sys
import datetime
# 2. 定义包级别的变量
package_variable = "This is a package variable"
# 3. 控制包的导入行为
__all__ = ['module1', 'module2']
# 4. 执行初始化代码
print("Initializing mypackage")
# 注意:这个代码会在包被导入时执行
# 5. 导入包内的模块
from . import module1
from . import module2
5. 子包的概念
包中还可以包含子包。例如:
my_package/
├── __init__.py
├── module1.py
└── sub_package/├── __init__.py└── sub_module.py
6. 命名建议
-
包名应使用小写字母,符合 Python 命名规范
-
避免使用与标准库同名的包名,如 math、random、os 等
7. 总结
包是一组相关模块的集合,用于模块的组织管理
需要
__init__.py
文件才能被 Python 识别为包包中可以嵌套子包形成多层结构
包让项目结构更清晰,利于维护和扩展
三、模块和包的对比
1. 基本概念对比
对比项 | 模块(Module) | 包(Package) |
---|---|---|
定义 | 一个 .py 文件,包含变量、函数、类等 | 一个包含 __init__.py 的目录,可包含模块或子包 |
本质 | 单个文件 | 文件夹 |
作用 | 封装逻辑,组织代码 | 组织多个模块或子包,构建大型项目结构 |
文件要求 | 任意 .py 文件即可 | 必须包含 __init__.py 文件 |
命名 | 一般用小写字母命名 | 一般用小写字母命名,避免与标准库同名 |
是否可嵌套 | 否(模块不可包含其他模块) | 是(包可包含子包和模块) |
示例 | math.py 、os.py | numpy 、pandas |
2. 使用场景对比
场景 | 适用对象 | 举例说明 |
---|---|---|
组织单个功能文件 | 模块 | string_utils.py 封装字符串处理函数 |
拆分多个相关模块 | 包 | utils/ 目录下包含 file_ops.py 、math_ops.py 等 |
搭建大型项目结构 | 包 | my_app/ 项目中含有多个子包与模块 |
重用代码 | 模块和包皆可 | 将模块或包导入多个项目中使用 |
四、导入
1. 导入模块的常用方式
1.1导入整个模块
import math
print(math.sqrt(16))
1.2从模块中导入指定内容
from math import sqrt
print(sqrt(25))
1.3给模块或函数起别名
import numpy as np
from math import sqrt as square_root
1.4同时导入多个成员
xxxxxxxxxx from math import sin, cos, tan
1.5通配符导入(不推荐)
from math import *
2.模块搜索路径(sys.path)
Python 在导入模块时会从以下路径中依次查找:
当前脚本所在目录
环境变量 PYTHONPATH 指定的目录
标准库路径
安装的第三方库路径(如 site-packages)
可以使用如下代码查看搜索路径:
import sys
print(sys.path)
3. 绝对导入与相对导入
3.1绝对导入:从项目根目录开始导入模块
from my_package.module1 import func
3.2相对导入:用于包内部模块之间的调用
from . import module1 # 当前目录
from ..subpackage import mod2 # 上一级目录
说明:
-
相对导入不能在顶层运行的脚本中使用,只能用于包内部模块互相调用
4. 动态导入模块
有时模块名是字符串,可以使用 importlib
动态导入模块:
import importlib
mod = importlib.import_module("my_package.module1")
mod.func()
5. 常见问题说明
导入失败:通常是路径不对、模块名拼错或不在搜索路径中
命名冲突:不要用标准模块名作为自定义模块名,例如:math.py、random.py
相对导入失败:不能在主程序中使用,只适用于包内部
推荐使用绝对导入,清晰明了,利于维护
6. 总结
Python 提供灵活的模块导入方式
推荐使用绝对导入进行跨模块调用
相对导入用于包内部模块互相引用
导入过程依赖 sys.path 中的路径列表
避免命名冲突、保持结构清晰是良好的导入习惯