第一个项目 · 45–60 分钟

做一个收据解析器。

把字符串、列表、字典、循环、函数、错误处理和 JSON 串成一个小程序。输入故意是脏的,输出应该可预测。

输入

纯文本,不是完美数据

每一行应该是 名称|数量|单价。有些行会是空行、格式错误,或者包含无法转换的数字。

输出

一个结果字典

返回商品列表、总额和错误列表。打印只是结果的一种展示,不是结果本身。

规则

只用标准库

使用 Python 内置的字符串、列表、字典、函数、异常和 json 模块。不安装包,不读写文件,不联网,也不使用 input()。

01 / 构建步骤

五个小步骤

  1. 01

    先清理行

    把收据拆成多行,去掉首尾空白,跳过空行;但保留行号,出错时才能指出是哪一行。

  2. 02

    解析字段

    按竖线拆分每一行,要求恰好三个字段;数量转成 int,单价转成 float,名称为空要拒绝。

  3. 03

    校验数值

    数量必须为正,单价不能为负。记录错误后继续处理下一行;一行坏数据不应该毁掉整张收据。

  4. 04

    计算金额

    为每个商品生成带两位小数的 line_total,最后只汇总一次,避免总额与明细对不上。

  5. 05

    返回并展示

    返回包含 items、total、errors 的字典。用单独的函数排版,再打印 JSON 摘要方便检查。

02 / 输出结构

最终结构

结构可预测,比一堆打印文字更容易测试。

{
  "items": [
    {"name": "Latte", "qty": 2, "price": 4.5, "line_total": 9.0}
  ],
  "total": 18.75,
  "errors": []
}
03 / 工作区

你的工作区

起始代码可以运行,但返回空结果。补完 TODO 后再运行。参考答案同时解析正常收据和坏收据,并做自检。

你的工作区本地运行 · 无需账号
首次运行会从 CDN 下载 Pyodide。先运行起始代码,再对照下面的验收条件。
04 / 验收

验收条件

  • parse_receipt 返回包含 items、total、errors 的字典。
  • 正常样本得到 3 个商品,总额为 18.75。
  • 空行会被跳过。
  • Tea|one|3.00 和 Broken 会进入错误列表,而不是让程序崩溃。
  • 运行参考答案的自检后,会打印 checks passed。
05 / 扩展

继续扩展

加一个折扣

接受可选折扣率,校验后作用于总额,同时在结果中保留折扣前的金额。

改读 CSV

熟悉 csv 模块后,把竖线样本换成小型 CSV 文件,复用同一套校验逻辑。

先写测试

把三个验收场景写成 assert。以后每次改代码,先跑测试,再改排版。