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(),且重複最大值只能算同一個數字。
原始版本採三段流程:
- 第一輪找最大值。
- 第二輪找到第一個小於最大值的元素,作為第二大候選。
- 第三輪找出所有不等於最大值、又大於候選值的元素。
現有範例輸出 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 與實際輸出衝突,以可執行程式與明確題目契約重新驗證。