第一個專案 · 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。以後每次改程式,先跑測試,再改排版。