第10章 综合项目

一个完整的“学生成绩分析”小项目:读数据 → 清洗 → 统计 → 出图 → 生成报告。

项目第15-16周2 讲3 段示例代码

本章学习目标

  • 能把前面九章的知识串成一个可运行程序
  • 能按模块拆分代码、写函数与文档字符串
  • 能生成一份带图表的分析报告
  • 能给程序加参数、做基本打包

本章导览

核心内容

10.1

综合项目:成绩分析程序

把前九章串起来:读 CSV → 清洗 → 统计 → 出图 → 生成报告。

能按“读入-处理-输出”拆分程序能封装成函数并组织成模块能生成图文报告

知识点

需求拆解

  • 输入:scores.csv(姓名, 科目, 分数)。
  • 处理:去空值、分数转数字、按科目分组求均分与及格率。
  • 输出:控制台表格 + bar.png + report.txt。

代码组织

  • 一个函数只做一件事:load_data / clean / analyze / report。
  • main() 里按顺序调用,if __name__ == "__main__" 保护入口。
  • 把常量(文件名、阈值)提到文件开头。

容错

  • 文件不存在、某行缺列、分数不是数字——都要 try 住并跳过。
  • 处理完打印“共读入 N 行,跳过 M 行”,方便核对。

代码示例

▶ 主流程骨架
PYTHON
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、负数、超大值。

代码示例

▶ 最简测试
PYTHON
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
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% 的路径与依赖问题。