模块化编程是一种将程序分解为独立,可重用的"模块"(Module)的编程思想,通过合理划分代码结构,实现**“高内聚,低耦合”** 的设计目标。在Python中,包和模块是代码组织和管理的重要概念。这种思想能显著提升代码的可读性,可复用性和可维护性,是现代编程中广泛采用的核心范式之一。
**定义:**模块是一个独立的代码文件(如Python的.py
文件、Java的.java
文件等),每个文件就是一个模块。包含函数、类、变量等代码单元,可被其他程序导入并使用。
作用:
高内聚:
模块内部的代码紧密相关,专注于实现单一功能(如一个模块只处理文件读写,另一个只处理数据计算),避免功能混杂。
低耦合:
模块之间的依赖关系尽可能简单,通过清晰的接口(如函数参数、返回值)通信,修改一个模块时不会对其他模块造成大规模影响。
模块化编程的优势
代码复用:
编写一次模块后,可在多个程序中通过导入重复使用,避免重复编码。例如,一个处理日期格式化的模块,可在多个项目中直接调用。
便于维护:
模块独立划分后,定位和修复 bug 更简单。例如,若数据计算出错,只需检查负责计算的模块,无需通读整个程序。
协作开发:
多人开发时,可按模块分工(如 A 开发用户认证模块,B 开发数据存储模块),减少代码冲突,提高开发效率。
降低复杂度:
将大型程序分解为多个小模块,每个模块专注解决一个子问题,降低单个文件的代码量和逻辑复杂度。
命名空间隔离:
不同模块的同名函数 / 变量不会冲突(通过模块名区分)。例如,moduleA.add()
和 moduleB.add()
可共存。
.py
文件即为一个模块,可通过 import
导入。创建一个calculator.py
# 模块:calculator.py
def add(a, b):
return a + b
def multiply(a, b):
return a * b
语法:
1. import 模块名 [as 模块新名字]
导入整个模块,并将其作为一个对象引入当前程序的命名空间。通过 “模块名。属性” 的方式使用模块内的功能(如函数、类、变量)。
2. from 模块名 import 模块属性名 [as 属性新名]
只导入模块中指定的部分属性(如特定函数、类),直接将这些属性引入当前命名空间,可直接使用属性名调用。
3. from 模块名 import *
导入模块中所有公开属性(受模块内 __all__
限制),直接引入当前命名空间,可直接使用属性名调用。
模块导入:使用 import
或 from...import
语句调用模块中的功能。
# 主程序:main.py
import calculator # 导入整个模块
print(calculator.add(2, 3)) # 输出:5
from calculator import multiply # 导入模块中的特定函数
print(multiply(2, 3)) # 输出:6
__file__
与 __name__
的对比表
属性 | 作用 | 主模块(直接运行)时的值 | 被导入模块时的值 |
---|---|---|---|
__file__ |
存储模块的路径 | 模块的绝对路径(如 D:/a.py ) |
模块的绝对路径(如 D:/a.py ) |
__name__ |
标识模块的名称 | '__main__' |
模块文件名(如 'a' ) |
__file__
是模块的 “位置身份证”,用于获取模块的路径信息,方便动态处理文件。__name__
是模块的 “身份标识”,核心作用是通过 if __name__ == '__main__'
区分模块的运行方式,实现 “测试代码隔离”。在 Python 中,模块根据其来源和性质可分为三类:内置模块、标准库模块和第三方模块,此外还包括用户自定义的模块。以下是详细分类及示例:
特点
print()
、len()
、type()
等内置函数)# 无需导入即可使用
print(len([1, 2, 3])) # 使用内置函数 len()
x = 10
print(type(x)) # 使用内置函数 type()
特点
即用即导入随 Python 安装包一起提供,无需额外安装,直接通过 import
使用。
覆盖广泛领域:文件操作、网络通信、数据处理、多线程等。
性能高效:通常使用 C 语言实现。
模块名称 | 所属类别 | 核心功能 | 官方文档链接 |
---|---|---|---|
math |
数学计算 | 提供三角函数(sin 、cos )、对数函数(log )、常量(pi 、e )等基础数学运算。 |
math 模块文档 |
os |
文件操作 | 与操作系统交互,如创建目录(mkdir )、删除文件(remove )、获取环境变量(environ )等。 |
os 模块文档 |
os.path |
文件操作 | 处理路径相关功能,如路径拼接(join )、判断路径是否存在(exists )、获取文件名(basename )等。 |
os.path 模块文档 |
datetime |
日期时间 | 提供 datetime 、date 、time 类,用于时间创建、格式化(strftime )、时间差计算(timedelta )等。 |
datetime 模块文档 |
random |
数学计算 | 生成随机数(random )、随机选择(choice )、打乱序列(shuffle )等。 |
random 模块文档 |
time |
日期时间 | 提供时间戳(time )、休眠(sleep )、时间格式化(strftime )等底层时间功能。 |
time 模块文档 |
shutil |
文件操作 | 高级文件操作,如递归复制目录(copytree )、移动文件(move )、删除目录树(rmtree )等。 |
shutil 模块文档 |
collections |
数据结构 | 提供 OrderedDict (有序字典)、defaultdict (默认值字典)、deque (双端队列)等扩展数据类型。 |
collections 模块文档 |
json |
序列化 | 实现 JSON 数据的编码(dumps )和解码(loads ),用于数据交换。 |
json 模块文档 |
unittest |
测试调试 | Python 内置的单元测试框架,支持测试用例编写、断言(assertEqual )、测试套件管理等。 |
unittest 模块文档 |
socket |
网络通信 | 底层网络编程接口,用于实现 TCP/UDP 协议的客户端和服务器端通信。 | socket 模块文档 |
urllib |
网络通信 | 处理 URL 相关操作,如发送 HTTP 请求(urllib.request )、解析 URL(urllib.parse )等。 |
urllib 模块文档 |
一、random
模块
函数 | 说明 | 示例 |
---|---|---|
random() |
生成 [0.0, 1.0) 之间的随机小数 |
random.random() |
uniform(a, b) |
生成 [a, b] 之间的随机小数 |
random.uniform(1, 10) |
randint(a, b) |
生成 [a, b] 之间的随机整数 |
random.randint(1, 10) |
randrange(start, stop[, step]) |
从范围内生成随机整数(不含 stop) | random.randrange(0, 10, 2) |
函数 | 说明 | 示例 |
---|---|---|
choice(seq) |
从序列中随机选择一个元素 | random.choice(['a', 'b', 'c']) |
choices(seq, k=n) |
从序列中随机选择 n 个元素(可重复) | random.choices([1, 2, 3], k=2) |
sample(seq, k=n) |
从序列中随机选取 n 个元素(不重复) | random.sample(range(10), 3) |
shuffle(seq) |
将序列就地随机打乱 | random.shuffle(my_list) |
函数 | 分布类型 | 示例 |
---|---|---|
betavariate(alpha, beta) |
Beta 分布 | random.betavariate(0.5, 0.5) |
expovariate(lambd) |
指数分布 | random.expovariate(1.5) |
gammavariate(alpha, beta) |
Gamma 分布 | random.gammavariate(2, 3) |
gauss(mu, sigma) |
高斯(正态)分布 | random.gauss(0, 1) |
normalvariate(mu, sigma) |
正态分布 | random.normalvariate(0, 1) |
lognormvariate(mu, sigma) |
对数正态分布 | random.lognormvariate(0, 1) |
triangular(low, high, mode) |
三角分布 | random.triangular(0, 10, 5) |
vonmisesvariate(mu, kappa) |
冯·米塞斯分布 | random.vonmisesvariate(0, 4) |
weibullvariate(alpha, beta) |
Weibull 分布 | random.weibullvariate(1, 1.5) |
函数 | 说明 | 示例 |
---|---|---|
seed(a=None) |
初始化随机数种子(可复现) | random.seed(42) |
getstate() |
获取当前内部状态 | state = random.getstate() |
setstate(state) |
恢复之前保存的状态 | random.setstate(state) |
案例1:random
综合小案例:
import random
# 1️⃣ 设置随机种子,保证结果可复现
random.seed(42)
# 2️⃣ 模拟随机抽奖
participants = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"]
winnner = random.choice(participants)
print(f"中奖者是:{winnner}")
# 3️⃣ 打乱名单,抽取3人二等奖(不重复)
participants.remove(winner)
random.shuffle(participants)
second_prize = random.sample(participants, 3)
print(f"二等奖名单为:{second_prize}")
# 4️⃣ 模拟生成10个正态分布的随机分数(均值为80,标准差为5)
scores = [round(random.gauss(80, 5), 2) for _ in range(10)]
print(f"生成的10个正态分布的随机分数为:{scores}")
案例2:密码生成器(random模块
,time模块
)
import random
import time
# 生成n为数字密码
def generate_digit_password(length):
password = ''
for _ in range(length):
digit = random.randint(0,9)
password += str(digit)
return password
# 生成n位混合密码
def generate_mixed_password(length):
password = ''
chars = '@!#$%^&*()_+/-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for _ in range(length):
char = random.choice(chars)
password += char
return password
print("密码生成中...")
time.sleep(2)
# password = generate_digit_password(4)
password = generate_mixed_password(8)
print("密码已生成:", password)
密码生成中...
密码已生成: bI_4xG7k
或者使用用时间戳+随机种子生成密码
import random
import time
def generate_password_with_timestamp(length):
chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 使用当前时间戳作为随机种子
timestamp = int(time.time() * 1000) # 毫秒级时间戳
random.seed(timestamp)
password = ''.join(random.choice(chars) for _ in range(length))
return password
# 示例
print("基于时间戳的随机密码:", generate_password_with_timestamp(12))
基于时间戳的随机密码: QouBvhRhuCT1
time
模块:
import time
# 获取当前时间的时间戳(秒)
timestamp = time.time()
print(f"返回当前时间的时间戳: {timestamp}")
# 获取当前本地时间的字符串表示
local_time_str = time.ctime()
print(f"返回当前的本地时间字符串: {local_time_str}")
# 获取当前本地时间的时间元组
local_time_tuple = time.localtime()
print(f"返回当前的本地时间元组: {local_time_tuple}")
# 暂停 2 秒
time.sleep(2)
# 格式化时间为 "年-月-日"
formatted_date = time.strftime("%Y-%m-%d", time.localtime())
print(f"格式化后的日期: {formatted_date}")
# 格式化时间为 "年-月-日 时:分:秒"
formatted_datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"格式化后的完整时间: {formatted_datetime}")
返回当前时间的时间戳: 1752838056.9255471
返回当前的本地时间字符串: Fri Jul 18 19:27:36 2025
返回当前的本地时间元组: time.struct_time(tm_year=2025, tm_mon=7, tm_mday=18, tm_hour=19, tm_min=27, tm_sec=36, tm_wday=4, tm_yday=199, tm_isdst=0)
格式化后的日期: 2025-07-18
格式化后的完整时间: 2025-07-18 19:27:38
OS
模块
os
模块 API函数 | 功能 |
---|---|
os.getcwd() |
获取当前工作目录 |
os.chdir(path) |
改变当前工作目录 |
os.listdir(path) |
列出指定目录下的文件和文件夹 |
os.mkdir(path) |
创建单层目录 |
os.makedirs(path) |
创建多层目录 |
os.rmdir(path) |
删除空目录 |
os.removedirs(path) |
递归删除空目录 |
os.remove(path) |
删除文件 |
os.rename(src, dst) |
重命名文件或目录 |
os.path.exists(path) |
判断路径是否存在 |
os.path.isfile(path) |
判断是否是文件 |
os.path.isdir(path) |
判断是否是目录 |
os.path.abspath(path) |
获取绝对路径 |
os.path.join(a, b) |
拼接路径(跨平台推荐用) |
os.environ |
获取环境变量字典 |
os.system(cmd) |
运行系统命令 |
import os
# 获取当前工作目录
print("当前工作目录:", os.getcwd())
# 如果 test_dir 目录存在,先删除
if os.path.exists('test_dir'):
os.rmdir('test_dir')
# 创建 test_dir 目录
os.mkdir('test_dir')
# 列出当前目录下的文件和文件夹
print("当前目录内容:", os.listdir())
# 拼接 test_dir 的绝对路径
new_path = os.path.join(os.getcwd(), 'test_dir')
print("test_dir 的绝对路径:", new_path)
# 判断路径相关信息
print("路径是否存在:", os.path.exists(new_path))
print("是否是目录:", os.path.isdir(new_path))
print("是否是文件:", os.path.isfile(new_path))
# 执行系统命令(输出 hello world)
os.system('echo "hello world"')
# 获取环境变量中的用户名
print("环境变量中的用户名:", os.environ.get('USERNAME'))
当前工作目录: E:\Workstation\PyCharm\Ai_250601
当前目录内容: ['.idea', '00.上课课件.Python', '01.day', '02.day', '03.day', '04.day', '05.day', '06.day', '07.day', '08.day', '09.day', 'personal_practice', 'test_dir']
test_dir 的绝对路径: E:\Workstation\PyCharm\Ai_250601\test_dir
路径是否存在: True
是否是目录: True
是否是文件: False
"hello world"
环境变量中的用户名: Gession
echo
命令敏感)用法 | 推荐度 |
---|---|
os.system() |
简单测试 ✅ |
subprocess.getoutput() |
建议常用 ✅✅✅ |
!命令 |
Jupyter 专用 ✅✅ |
os.environ
是一个类似字典的对象,用来访问系统的环境变量。
它的“键”就是当前系统中的环境变量名称,通常是操作系统设定的。
环境变量名 | 含义 |
---|---|
PATH |
可执行程序的搜索路径 |
HOME |
用户主目录(Linux/macOS) |
USERPROFILE |
用户主目录(Windows) |
USERNAME |
当前用户名 |
TEMP / TMP |
临时文件目录 |
OS |
操作系统类型(Windows 常有) |
COMSPEC |
命令解释器路径 |
PATHEXT |
可执行文件扩展名(Windows) |
APPDATA |
应用数据目录(Windows) |
PYTHONPATH |
Python 模块搜索路径 |
PYTHONHOME |
Python 安装路径 |
SHELL |
当前使用的 shell(Linux/macOS) |
json
模块
函数 | 功能 |
---|---|
json.loads(s) |
将 JSON 字符串 解析 成 Python 对象 |
json.dumps(obj) |
将 Python 对象 编码 成 JSON 字符串 |
json.load(fp) |
从文件读取 JSON 并解析成 Python 对象 |
json.dump(obj, fp) |
将 Python 对象转为 JSON 并写入文件 |
import json
# Python 对象
data = {"name": "Tom", "age": 18, "hobbies": ["reading", "coding"]}
# ✅ dumps:对象转 JSON 字符串
json_str = json.dumps(data, indent=2, ensure_ascii=False)
print("JSON 字符串:\n", json_str)
# ✅ loads:JSON 字符串转 Python 对象
parsed_data = json.loads(json_str)
print("解析后的对象:", parsed_data)
# ✅ dump:对象写入 JSON 文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
# ✅ load:从 JSON 文件读取并解析
with open('data.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
print("从文件读取的对象:", loaded_data)
输出结果:
JSON 字符串:
{
"name": "Tom",
"age": 18,
"hobbies": [
"reading",
"coding"
]
}
解析后的对象: {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'coding']}
从文件读取的对象: {'name': 'Tom', 'age': 18, 'hobbies': ['reading', 'coding']}
大多数通过命令:
pip install 模块名
conda install 模块名
即可安装
模块名 | 说明 |
---|---|
numpy |
数组与矩阵运算 |
pandas |
数据清洗与分析 |
scipy |
科学与工程计算 |
matplotlib |
绘图与可视化 |
seaborn |
高级统计图表(基于 matplotlib) |
pandas 模块示例
# pip install pandas
import pandas as pd
data = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
df = pd.DataFrame(data)
print("表格内容:\n", df)
print("平均年龄:", df['age'].mean())
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()
模块名 | 说明 |
---|---|
scikit-learn |
通用机器学习库 |
tensorflow |
Google 深度学习框架 |
torch (PyTorch) |
Facebook 深度学习框架 |
xgboost |
高效的梯度提升算法 |
模块名 | 说明 |
---|---|
requests |
简单易用的 HTTP 客户端 |
httpx |
支持异步的 HTTP 客户端 |
beautifulsoup4 |
HTML/XML 解析库 |
lxml |
高性能 HTML/XML 解析 |
selenium |
自动化浏览器操作 |
requests 模块示例
import json
import os
import requests
# 十分类
CATEGORYS = {
'airplane': '飞机',
'automobile': '汽车',
'bird': '鸟',
'cat': '猫',
'deer': '鹿',
'dog': '狗',
'frog': '青蛙',
'horse': '马',
'ship': '船',
'truck': '卡车'
}
User_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'
headers = {
'User-Agent': User_Agent
}
def download_image(key_class, word, index, image_url):
response = requests.get(image_url)
if response.status_code != 200:
raise Exception('图片请求失败')
current_path = os.path.dirname(__file__)
save_path = os.path.join(current_path, 'images', key_class)
if not os.path.exists(save_path):
os.makedirs(save_path)
os.chdir(save_path)
with open(f'{word}_{index}.jpg', 'wb') as f:
f.write(response.content)
print(f'关键字:{key_class} -> {word}_{index}.jpg 下载成功')
PAGE_NUM = 3
if __name__ == '__main__':
for key_class, word in CATEGORYS.items():
for page in range(PAGE_NUM):
image_url = f'https://image.baidu.com/search/acjson?tn=resultjson_com&word={word}&ie=utf-8&fp=result&fr=&ala=0&applid=8923700731872655071&pn={30 * (page + 1)}&rn=30&nojc=0&gsm=3c&newReq=1'
request = requests.get(url=image_url, headers=headers).text
request = json.loads(request)
picture_list = request['data']['images']
for index, picture in enumerate(picture_list):
url = picture['thumburl']
download_image(key_class, word, (page * 30 + index) + 1, url)
模块名 | 说明 |
---|---|
flask |
轻量级 Web 框架 |
django |
全功能 Web 框架 |
fastapi |
异步、类型安全的 Web 框架 |
模块名 | 说明 |
---|---|
sqlalchemy |
通用 ORM 工具 |
pymysql |
MySQL 数据库驱动 |
psycopg2 |
PostgreSQL 数据库驱动 |
模块名 | 说明 |
---|---|
openpyxl |
操作 Excel (.xlsx) |
xlrd / xlwt |
读取/写入 Excel (.xls) |
python-docx |
处理 Word 文档 |
pdfplumber |
提取 PDF 文本内容 |
pyautogui |
自动化鼠标键盘操作 |
模块名 | 说明 |
---|---|
virtualenv / venv |
创建虚拟环境 |
pipenv |
虚拟环境与依赖管理 |
poetry |
项目管理与构建 |
功能 | 命令 | 说明 |
---|---|---|
创建新环境 | conda create -n 环境名 python=版本号 |
创建指定 Python 版本的虚拟环境 |
激活环境 | conda activate 环境名 |
进入指定环境 |
退出环境 | conda deactivate |
离开当前环境 |
查看所有环境 | conda env list 或 conda info --envs |
查看已创建的环境列表 |
删除环境 | conda remove -n 环境名 --all |
删除指定环境 |
功能 | 命令 | 说明 |
---|---|---|
导出当前环境依赖 | conda env export > environment.yml |
将当前环境的所有依赖(含版本)导出为 YAML 文件 |
基于环境文件创建环境 | conda env create -f environment.yml |
根据环境文件安装所有依赖并创建新环境 |
更新已有环境依赖 | conda env update -f environment.yml |
将当前环境更新为 environment.yml 中指定的依赖 |
查看已安装模块 | conda list |
列出当前环境下的所有已安装模块及版本 |
name: myenv
channels:
- defaults
dependencies:
- python=3.10
- numpy=1.24
- pandas=1.5
- pip
- pip:
- requests==2.31.0
tools.py
def add(a, b):
return a + b
使用示例
import tools
print(tools.add(3, 5))
跨文件夹使用
project/
utils/
__init__.py
math_utils.py
main.py
main.py 中调用
from utils.math_utils import add
print(add(3, 5))
import math # 导入模块
from math import sqrt # 导入模块中的函数
import numpy as np # 给模块起别名
from math import * # 导入所有内容(不推荐)
加载模块时查找顺序:
1️⃣ 当前目录
2️⃣ PYTHONPATH 环境变量目录
3️⃣ 标准库目录
4️⃣ 第三方库目录(如 site-packages)
查看路径:
import sys
print(sys.path)