目录
一、模块
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__.py
math_utils.py
main.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 中的路径列表
避免命名冲突、保持结构清晰是良好的导入习惯
2182

被折叠的 条评论
为什么被折叠?



