Python 基礎練習:逐日實作與除錯紀錄

Python 基礎練習:逐日實作與除錯紀錄

逐日整理清單、迴圈、條件與狀態更新練習的實際演算法、執行輸出、已知缺陷與學習邊界。

Python 基礎練習:逐日實作與除錯紀錄

定位/對應既有頁

本頁是 Learning/python foundations practice 的逐檔技術紀錄。既有頁保存七天練習的學習目標;本頁記錄目前程式實際採用的狀態變數與走訪方式、對範例資料的輸出,以及不能被「範例剛好跑對」掩蓋的邊界條件。

已確認技術

  • 所有練習都是可直接用 Python 3 執行的單檔腳本。
  • 只使用 Python 內建的 list、for、if/elif、數值運算、切片、list.index() 與輸出。
  • 沒有第三方套件、函式封裝、命令列參數、輸入檔、套件結構或測試框架。
  • Day 6 同時保留原始解法與一份較完整的單次走訪解法,適合比較狀態設計。

資料流/演算法

Day 1:計算及格人數

  • 輸入:[55, 80, 42, 91, 60]。
  • 以 count 從 0 開始;每個分數大於等於 60 時加 1。
  • 目前輸出:3。

這是「條件成立才更新累加器」的最小範例。

Day 2:手動找最大值

  • 以變數保存目前最大值,逐筆比較並更新。
  • 目前輸出:91。

目前實作把初始值設為 0,且把變數命名為 max。在現有全為非負數的範例可得到正確答案,但有兩個泛化問題:全為負數時會錯誤保留 0;名稱也遮蔽 Python 內建的 max()。

Day 3:總分累加

  • 以 total_score=0 開始,逐筆使用 += 累加。
  • 目前輸出:328。

Day 4:偶數總和

  • 對每個數字做 % 2 == 0 判斷。
  • 只有偶數加入累加器。
  • 目前輸出:30,來自 8、12、10。

Day 5:正數、負數與零的分類計數

  • 三個計數器分別保存正數、負數與零。
  • 每筆數字只會進入一個 if/elif 分支。
  • 目前結果為正數 3、負數 3、零 1,合計 7,與輸入長度相同。

程式中的 compare_value 沒有被使用;prostive、nagative 是輸出文字與變數的拼字問題,不影響目前計數結果,但會降低可讀性。

Day 6:第二大的不同數字

題目限制不能使用 max()、sort() 或 sorted(),且重複最大值只能算同一個數字。

原始版本採三段流程:

  1. 第一輪找最大值。
  2. 第二輪找到第一個小於最大值的元素,作為第二大候選。
  3. 第三輪找出所有不等於最大值、又大於候選值的元素。

現有範例輸出 7。這個版本會走訪多次,並假設清單非空且至少有兩個不同數字;若所有數字相同,初始化的 0 可能被錯當答案。

day6_solution.py 改成一次走訪:

  • largest 與 second_largest 都由 None 開始。
  • 遇到新的最大值時,把舊最大值下放到第二大。
  • 否則只在數字不同於最大值,而且比目前第二大更大時更新。

這個版本能自然處理負數與重複最大值,現有範例同樣輸出 7;但若輸入不足兩個不同數字,結果仍會是 None,目前沒有另外回報錯誤。

Day 7:第一個重複出現的數字

註解要求由左到右找出最早「第二次出現」的數字;在 [3, 5, 2, 4, 5, 3] 中,預期輸出是 5。

目前實作沒有達成這個目標:

  • target 只在第一次迴圈被設為第一個元素 3,之後沒有跟著目前元素更新。
  • numbers.index(number) 永遠回傳該值第一次出現的位置,不代表外層迴圈目前所在的 index。
  • 內層找到 target 後只跳出內層迴圈,外層仍繼續,因此重複輸出。

實際執行目前程式會印出六次 3,不是註解預期的 5。Day 7 目前未完成,不能列為通過。

比較適合的解法方向是在走訪到 index i 時,只檢查 numbers[:i] 是否已包含目前數字;第一次成立就輸出並停止。若仍遵守不能用 set 與 count(),可用巢狀迴圈或手動維護已看過的 list。

測試驗證

本次針對目前八個腳本直接執行範例,結果如下:

檔案 目前輸出摘要 與題意狀態
day1.py 3 範例通過
day2.py 91 範例通過,負數邊界未處理
day3.py 328 範例通過
day4.py 30 範例通過
day5.py 3/3/1,合計 7 範例通過,有命名問題
day6.py 7 範例通過,特殊輸入未處理
day6_solution.py 7 範例通過,少於兩個不同值時回傳 None
day7.py 六次 3 未通過,預期為 5

目前沒有 assert、單元測試或表格驅動測試。若要驗證演算法而不只驗證單一範例,至少應加入:空清單、單一元素、全相同、全負數、最大值重複、重複值出現在不同位置,以及完全沒有重複值。

部署/執行邊界

  • 這些檔案是本機學習練習,不是可部署服務、函式庫或命令列產品。
  • 執行只需要 Python 3,不需要專案內的虛擬環境或額外套件。
  • 腳本目前把輸入直接寫在檔案中,沒有使用者輸入、資料驗證或錯誤處理介面。
  • 程式直接印出結果,沒有穩定的函式回傳契約,暫時不適合被其他模組重用。

限制

  • 單一 happy-path 範例不足以證明演算法正確。
  • Day 2 的初始值與命名只適合當前資料。
  • Day 5 有未使用變數與拼字問題。
  • Day 6 原始版本多次走訪,兩個版本都未定義「不存在第二大不同數字」時的正式行為。
  • Day 7 的控制流程與索引概念仍需重寫。
  • 尚未練習函式、型別提示、例外、檔案 I/O、模組化與自動測試。

公開邊界

可公開:題目概念、固定的小型數字範例、演算法比較、實際輸出與錯誤分析。

不公開:虛擬環境內容、本機安裝路徑或與練習無關的個人資料。公開文件不複製整份程式碼,避免 Wiki 與原始檔形成兩份會漂移的實作來源。

Source of truth

  • ../Python practice/day1.py
  • ../Python practice/day2.py
  • ../Python practice/day3.py
  • ../Python practice/day4.py
  • ../Python practice/day5.py
  • ../Python practice/day6.py
  • ../Python practice/day6_solution.py
  • ../Python practice/day7.py

上述腳本是行為的 source of truth;若註解、Wiki 與實際輸出衝突,以可執行程式與明確題目契約重新驗證。

相關筆記