C1第 6 / 6 节 · 约 55 分钟

综合制作离线阅读记录检查器

本节目标
  • 整合数据解析、字段校验与汇总
  • 区分离线规则程序与AI应用的工程边界

把基础拼成一个小作品

晨光书架需要检查两条虚构阅读记录,并显示总分钟数。这不是训练模型,也不是聊天机器人,只是依据明示规则解析和汇总数据。综合练习要让输入、处理、输出与错误边界连成完整路径。当前输入直接保存在代码中的JSON字符串,不读写磁盘、不联网、不使用密钥,避免新手把数据整理误做成外部服务调用。网页只展示示例,实际执行仍由学习者在合适的授权本地环境自行进行。

先写数据协议再写代码

输入必须是列表,每项必须是字典,包含非空书名title和非负整数minutes。允许空列表,合计为零;不接受缺字段、空白书名、布尔值或负分钟。输出只显示记录数量与合计,不声称判断阅读质量。明确协议可以防止程序凭猜测修复资料,例如空书名不应自动取名未知好书。如果要处理真实文件,还需额外考虑路径、编码、授权和文件大小,本节不扩展这些未需要的功能。

完整离线示例

import json
def summarize(text):
    records = json.loads(text)
    if type(records) is not list:
        raise ValueError("顶层必须是列表")
    total = 0
    for record in records:
        if type(record) is not dict:
            raise ValueError("每条记录必须是字典")
        title = record.get("title")
        minutes = record.get("minutes")
        if type(title) is not str or not title.strip():
            raise ValueError("书名必须是非空文本")
        if type(minutes) is not int or minutes < 0:
            raise ValueError("分钟必须是非负整数")
        total += minutes
    return {"count": len(records), "total_minutes": total}
data = '[{"title": "纸上花园", "minutes": 12}, {"title": "云朵小路", "minutes": 8}]'
print(summarize(data))
  1. 第一行导入标准库JSON解析工具。
  2. 第二行定义接收文本的汇总函数。
  3. 第三行解析输入文本,格式错误会明确报错。
  4. 第四行检查顶层是否为普通列表。
  5. 第五行在类型不符时停止并解释要求。
  6. 第六行建立零合计。
  7. 第七行逐条处理记录。
  8. 第八行检查每项是否为字典。
  9. 第九行拒绝非字典项。
  10. 第十行读取书名,缺字段时得到空值。
  11. 第十一行读取分钟,缺字段时得到空值。
  12. 第十二行检查书名类型与去除两端空白后是否为空。
  13. 第十三行拒绝无效书名。
  14. 第十四行检查分钟类型与非负要求。
  15. 第十五行拒绝非法分钟。
  16. 第十六行累加合法值。
  17. 第十七行返回记录数与总分钟数字典。
  18. 第十八行提供两条完全虚构记录。
  19. 第十九行调用函数并显示结果。

验收不是只看屏幕

正常结果应包含记录数二、总分钟二十。先独立计算十二加八,再核对输出。空列表应返回零和零,缺minutes字段应被拒绝,空白书名与负分钟也应被拒绝。出现异常并不一定表示程序坏了,若输入不符合协议,清楚拒绝正是预期行为。可以沿用上一课的标准库测试方法,把这些案例保存为测试,而不是每次靠记忆检查。

明确作品边界

这个小作品展示了数据流程,不是生产应用。它没有登录、权限管理、持久存储或真实模型调用,也没有自动识别书籍内容。未来接入AI时,还需要来源验证、请求失败处理与安全审阅,不能认为能运行就能上线。当前任务保持最小功能,不增加无关工具。最终交付应附输入协议、预期输出、错误案例和逐行说明,让另一位初学者能够复核程序做了什么以及没有做什么。

本节要点

  • 综合程序应先定义输入协议与错误行为
  • 离线规则处理不等于训练或调用AI
  • 展示型小作品不等于生产可用系统

动手练习:验收离线检查器的四类输入

  1. 手工核对正常示例的数量与合计
  2. 用空列表预测零记录、零分钟
  3. 分别删除minutes字段与把书名改为空白,记录预期拒绝
  4. 说明作品不具备哪些AI和生产功能

自查清单

  • 正常、空与非法输入的预期明确
  • 明确离线演示与AI、生产系统的区别
先自己做,再查看参考答案

正常输入两条记录,十二加八等于二十,因此返回count为二、total_minutes为二十。空列表返回两项都为零,因为没有记录进入循环。删除minutes后get得到空值,分钟类型检查不通过,预期抛出ValueError;书名只有空格时,strip后为空,也应明确拒绝。这些不是静默修补数据的机会,输入应由提交者核对。作品只解析和汇总虚构数据,没有调用AI、训练模型、登录、网络请求或磁盘保存。本网页不执行代码,也不会自动评判开放练习。交付时注明标准库依赖、输入协议和测试结果,不能把一次运行正常当成生产系统已经安全可靠。

本节自测

学完了吗?

标记后会记录在本机浏览器,课程首页显示你的进度。