第10章 综合项目
一个完整的“学生成绩分析”小项目:读数据 → 清洗 → 统计 → 出图 → 生成报告。
本章学习目标
- 能把前面九章的知识串成一个可运行程序
- 能按模块拆分代码、写函数与文档字符串
- 能生成一份带图表的分析报告
- 能给程序加参数、做基本打包
本章导览
核心内容
10.1
综合项目:成绩分析程序
把前九章串起来:读 CSV → 清洗 → 统计 → 出图 → 生成报告。
能按“读入-处理-输出”拆分程序能封装成函数并组织成模块能生成图文报告
知识点
需求拆解
- 输入:scores.csv(姓名, 科目, 分数)。
- 处理:去空值、分数转数字、按科目分组求均分与及格率。
- 输出:控制台表格 + bar.png + report.txt。
代码组织
- 一个函数只做一件事:load_data / clean / analyze / report。
- main() 里按顺序调用,if __name__ == "__main__" 保护入口。
- 把常量(文件名、阈值)提到文件开头。
容错
- 文件不存在、某行缺列、分数不是数字——都要 try 住并跳过。
- 处理完打印“共读入 N 行,跳过 M 行”,方便核对。
代码示例
▶ 主流程骨架
import csv
from statistics import mean
def load(path):
with open(path, encoding="utf-8") as f:
return list(csv.DictReader(f))
def analyze(rows):
by_subject = {}
for r in rows:
by_subject.setdefault(r["科目"], []).append(float(r["分数"]))
return {k: {"人数": len(v), "均分": round(mean(v), 1),
"及格率": round(sum(1 for s in v if s >= 60) / len(v), 2)}
for k, v in by_subject.items()}
if __name__ == "__main__":
rows = load("scores.csv")
for sub, stat in analyze(rows).items():
print(sub, stat)👀 运行结果
语文 {'人数': 3, '均分': 85.3, '及格率': 1.0}
数学 {'人数': 3, '均分': 78.7, '及格率': 0.67}常见错误
⚠️ 踩坑与解决
某行缺列导致 KeyError
→ 数据不干净;用 row.get("科目") 并跳过空行分数列有空字符串导致 float 报错
→ 直接 float("");先 if not s: continue,或 try/except
💡 先把“能跑通的最小版本”写完,再补清洗与异常,比一开始追求完美更快。
10.2
项目交付:文档、打包与测试
作业和工程的区别:有说明、有结构、能复现。
能给项目写 README 与文档字符串能用 pip 冻结依赖、用 venv 隔离环境能写最简测试并运行
知识点
项目结构
- project/ ├─ main.py ├─ utils.py ├─ data/ └─ README.md。
- README 写清:做什么、怎么装、怎么跑、输出什么样。
- 把示例数据一并提交,别人才能复现。
环境与依赖
- python -m venv .venv 建虚拟环境,激活后 pip install 不影响全局。
- pip freeze > requirements.txt 记录依赖,别人 pip install -r 即可。
- venv 目录不要提交到代码仓库。
测试
- 最简测试:给函数喂几组输入,断言输出是否符合预期。
- assert 失败会抛 AssertionError;pytest 可以做更完整的用例。
- 先测“边界”:空列表、0、负数、超大值。
代码示例
▶ 最简测试
from main import analyze
def test_empty():
assert analyze([]) == {}
def test_one():
rows = [{"科目": "语文", "分数": "90"}]
assert analyze(rows)["语文"]["均分"] == 90.0
test_empty()
test_one()
print("全部通过")👀 运行结果
全部通过
▶ 依赖记录
python -m venv .venv
.venv\Scripts\activate # Windows
pip install numpy matplotlib
pip freeze > requirements.txt👀 运行结果
生成 requirements.txt
常见错误
⚠️ 踩坑与解决
ModuleNotFoundError 在别人电脑上
→ 依赖没写进 requirements;pip freeze 后一并提交pytest 找不到测试
→ 文件名/函数名不符合 test_ 约定;改名为 test_*.py / test_*()
💡 交付前自己“换个目录、重新跑一遍”,能发现 80% 的路径与依赖问题。