Python第一本書怎麼選:寫出能解釋、能測試的小程式
第一個有用的里程碑,是能解釋、修改並測試一個小程式,而不是看過一長串語法。選一本主教材,把同一個資料彙整任務從預測推進到函式、集合、檔案與測試;其餘書籍用來補充特定問題,不必同時安排三套進度。
學習路線與例題編輯責任:University Reading List 編輯專案。 編輯與選書方法 · 來源核驗日期:
適用範圍與編輯責任
適合會基本算術、能操作檔案的程式設計新手。章節對應 Think Python 第3版、Python Crash Course 第3版與 Guttag 的 Introduction to Computation and Programming Using Python 第3版。任務為本站建議;資料與函式均為本指南原創,並非書中原題或正式營運的監測系統。
選擇你的起點
我想從免費、重解釋的路線開始
使用作者公開的 Think Python 網頁,執行筆記本或自己寫的小檔案。先預測再執行,記錄差異;免費線上閱讀不等於免費取得紙本。
我適合邊做作品邊學
先用 Python Crash Course 第一部分打底,再從第二部分選一個專案。先完成可測試的小核心,再接圖形或網站;同時啟動三套工具容易遮蔽自身邏輯的問題。
我想進一步做計算模型與資料分析
使用 Guttag,從前面的程式與測試章節開始。數學基礎較好的新手亦可作為第一本,但後半的模擬與資料方法需要比基本語法更長的學習路線。
三本書如何取捨
Python程式設計思維:如何像電腦科學家一樣思考
Allen B. Downey · 版次: 3 · 2024
免費的概念入門主線
- 適合何時選擇
- 希望藉短小可執行的例子、清楚術語與漸進解釋打底,再做大型應用。
- 何時另選路線
- 立刻需要指定專案的技術組合,或完整的統計建模課程。
- 建議閱讀範圍
- 本路線先用第1–3、5–7、9–10章;文字處理可讀第8章,檔案可讀第13章;第14–17章的物件內容可稍後學。
- 限制與取捨
- 第3版重排章節並採筆記本,舊版章號未必對應相同主題。作者提供免費網頁;Colab是可選的第三方執行服務,不是課程證書。
選書前試做
讀Think Python串列與字典章節後,不執行程式,追蹤[("A",0),("A",None),("A",6)],逐筆畫出總和與計數。
檢查標準: 最後總和6、計數2、平均3.0;None不增加計數,零要計數。解釋狀態如何變化,而不只複述輸出。
Python Crash Course: A Hands-On, Project-Based Introduction to Programming(Python 程式設計:從入門到實務專案)
Eric Matthes · 版次: 3 · 2022
有引導的作品路線
- 適合何時選擇
- 希望做出遊戲、資料視覺化或網站,也願意先完成語言基礎。
- 何時另選路線
- 尚不能追蹤短迴圈或函式的執行;直接進入完整框架可能掩蓋理解缺口。
- 建議閱讀範圍
- 第一部分第1–8、10–11章支持本路線。大型專案在第12–14、15–17、18–20章,小程式運作後再選一條。
- 限制與取捨
- 出版社註明第3版於2022年12月發行。相依套件與部署方案會改變,應查作者勘誤和更新,不把印刷版的服務名稱當作永久有效。
選書前試做
讀Python Crash Course第10–11章後,把計算與檔案、輸入處理分開,分別為空輸入、只有零、全部缺失寫三個小測試。
檢查標準: 計算函式接收資料並回傳結果,不開啟檔案;三類輸入的契約與預期值清楚,測試失敗不依賴手動操作整個專案。
Python運算和程式設計導論
John V. Guttag · 版次: 3 · 2021
計算問題求解的延伸
- 適合何時選擇
- 想把程式連接到演算法、模擬與資料解釋,並願意說明數學假設。
- 何時另選路線
- 當下只需要第一段小腳本,或目標是部署教學而非計算課程。
- 建議閱讀範圍
- 先讀第1–5、7–9章;第11–12章延伸演算法,第16–22章進入模擬與統計,第23章介紹pandas。
- 限制與取捨
- 所選第3版出版於2021年,附Python 3.8速查表,不保證所有歷史套件範例在今日皆能原樣執行。記錄環境,查閱配套程式與勘誤。
選書前試做
沿Guttag早期函式與測試路線,說明接受的資料契約,並寫出連接累計總和、計數與已處理資料的迴圈不變量。
檢查標準: 不變量只涵蓋目前處理過的合規資料,區分缺失與數值大小;舉出一種契約外輸入,以及普通單元測試不能保證的一項數值限制。
檢查先修準備
字串「12」與數字12是同一種值嗎?
不是。型別不同,支援的操作也不同。應刻意轉換輸入,並先定義不合法值的處理方式,再進行計算。
零值與遺漏值可以互換嗎?
不能。本例零是有效觀測,None表示遺漏;兩者在真偽測試中皆為假,因此篩選條件必須明寫資料規則。
實作函式前應說明什麼?
規定可接受輸入、回傳輸出與邊界行為。本例省略沒有有效讀數的站點,不改變呼叫者的資料;沒有有效值不代表平均為零。
六步學習與具體成果
已標記完成的成果: 0 / 6
勾選用於自我記錄,並非成績評定;標記不會傳送給本站。
-
1. 預測短運算式並檢查型別
建議閱讀範圍: Think Python 第1–2章;Crash Course 第1–2章;Guttag 第1–2章。
動手產出: 寫一份小腳本或筆記本,列出數值、字串、比較與除法的六個運算式。執行前寫預期值與型別,再解釋不一致處。
檢查標準: 看到輸出不等於理解;能區分數字、數字印出後的文字,以及輸入取得的字串。
-
2. 把資料規則轉為條件
建議閱讀範圍: Think Python 第5、7章;Crash Course 第4–5、7章;Guttag 第2.3–2.6節。
動手產出: 先手動追蹤下方資料,標示零值與遺漏值是否計入,再寫一個每列只走訪一次的迴圈。
檢查標準: 保留零,只略過None;換序不改變哪些觀測有效,也不在走訪時刪除原集合的項目。
-
3. 為計算寫下契約
建議閱讀範圍: Think Python 第3、6章;Crash Course 第8章;Guttag 第4章。
動手產出: 實作前先寫函式的輸入、輸出、空輸入行為,把回傳結果與印出友善報告分開。
檢查標準: 他人不必在提示框輸入就能呼叫函式,回傳值可供後續運用,原始輸入維持不變。
-
4. 依鍵累加後,再算平均
建議閱讀範圍: Think Python 第9–10章;Crash Course 第3–4、6章;Guttag 第5章。
動手產出: 依完整例題分別維護總和與計數字典,新增一個站點,追蹤第一筆有效讀數如何建立項目。
檢查標準: 每筆有效紀錄只對其站點加一次總和、一次計數;分母不是站點數,也不能包含遺漏紀錄。
-
5. 讓檔案與失敗可被辨識
建議閱讀範圍: Think Python 第8、13章;Crash Course 第10章;Guttag 第7、9章。
動手產出: 儲存小型本機測試資料,另外寫載入器,交代空白、格式錯誤、非數字欄位的處理,不將這些決定偷偷混入已約定的平均函式。
檢查標準: 檔案載入失敗須回報,不靜默偽裝為成功的空結果。使用虛構資料,不需個資或正式系統紀錄。
-
6. 交付可重現的小專案
建議閱讀範圍: 重讀 Think Python 第7、9章;Crash Course 第11章;Guttag 第8章。
動手產出: 提交函式、測試資料、測試與執行說明,檢查基準、空輸入、全遺漏、只有零、輸入不變,以及換序或整體重複。
檢查標準: 預期答案應獨立手算,不能從程式輸出抄回測試。讀者可重跑並辨識未支援輸入,少數案例通過不表示已適合正式營運。
原創例題與解析
零是讀數,None不是
對資料[("A", 12), ("B", None), ("A", 0), ("B", 8), ("A", 18)],回傳各站點有效讀數的平均。保留零、略過None,省略沒有有效讀數的站點,且不更動原資料。
前提假設
每列包含字串站點與有限整數/浮點數或None;布林值、格式錯誤列、NaN不屬於本例輸入契約。讀數使用同一任意單位。空輸入或全遺漏輸入回傳空字典。這是虛構教學資料。 讀數大小與紀錄數量亦須確保各站點的累加總和維持有限;這個簡單浮點計算不處理溢位,也不保證所有有限輸入都能精確計算。
- 先看資料:A有12、0、18,總和30,共3筆;B僅有有效讀數8,None既不貢獻數值,也不貢獻計數。
- 分別建立總和、計數字典,走訪時以value is None決定是否略過,不使用if value判定有效性。
- 每筆有效紀錄加入相應站點的總和,並使其計數加一;迴圈後,各總和除以各自計數。
- A得到30 / 3 = 10.0,B得到8 / 1 = 8.0。從未有有效觀測的站點沒有總和、計數項目,會被省略,因此沒有零分母。
- 若錯用真偽值篩選,A的零會被捨棄,得到(12 + 18) / 2 = 15.0。程式沒有例外,仍可能回答了錯誤的問題。
答案與解釋
結果為{"A": 10.0, "B": 8.0}。下方完整函式表達約定的資料規則,回傳結果、不改輸入,也不把計算綁定於檔案、筆記本或輸入提示。
def means_by_site(rows):
totals = {}
counts = {}
for site, value in rows:
if value is None:
continue
totals[site] = totals.get(site, 0) + value
counts[site] = counts.get(site, 0) + 1
means = {}
for site in totals:
means[site] = totals[site] / counts[site]
return means
檢驗結果
檢查[] → {}、[("A", None)] → {}與[("A", 0)] → {"A": 0.0}。對題給小整數,重排資料或複製全部有效資料會保持平均;一般浮點輸入還需單獨分析捨入,不能保證順序變化後精確相等。("A", "bad")等資料需要在本有限契約之外另訂驗證規則。
改變假設,再做一題
合併批次不能只保留平均
將原虛構資料分為batch1=[("A",12),("A",0),("B",None)]與batch2=[("A",18),("B",8)],保留輸入與缺失規則。若不保存原始資料,怎樣合併批次摘要得到各站點平均?直接平均批次平均是否足夠?本題使用可精確表示的小整數。
- batch1得到A:(總和12,計數2),B沒有有效摘要;batch2得到A:(18,1)、B:(8,1)。沒有摘要不等於測得零。
- 逐站點相加總和與計數,得A:(30,3)、B:(8,1),最後除一次得A10.0、B8.0,與一起處理原始資料相同。
- A的兩個批次平均為6與18,直接平均得12,因批次樣本數不同而錯誤。加權平均(2×6+1×18)/(2+1)=10才與合併結果一致。
答案與解釋
每批為每站點保留(總和,計數),分別相加後再除。只有平均而無計數,通常無法恢復合併平均。本題回傳{"A":10.0,"B":8.0}。
檢驗結果
把一筆資料移到另一批重算:這些小整數的合併平均不變,但批次平均的簡單平均可能變化。一般浮點輸入在數學上重新分組,並不保證逐位相等;還須單獨評估捨入與有依據的誤差界限。
常見誤區
輸出合理,不代表程式正確
錯誤答案A = 15.0也很平常。保留能區分預期規則與常見錯誤實作的手算案例。
把教材版本當作軟體環境
章節對應特定版次,相依套件與託管說明卻會演變。記錄實際Python與套件版本,部署前查作者更新。
未隔離邏輯就加入套件
平均函式只需內建功能。先獨立測試,再連接繪圖、CSV載入或網頁,否則環境與邏輯錯誤更難區分。
進入下一階段之前
- 能選擇概念、作品或建模導向的主教材,並說明哪些內容先暫緩。
- 能追蹤完整函式、解釋零與None的差異,以及站點沒有有效讀數時的結果。
- 小專案具備獨立預期值、邊界檢查與執行說明,不把少量成功案例視為普遍正確的證明。
來源與版次核驗
來源核驗日期:
- Allen B. Downey — free third-edition webbook and contents
作者第3版網頁確認免費全文、筆記本路線與章節順序。可選的線上執行服務與閱讀不同,本指南不複製原書習題。
- O’Reilly — third-edition publication and copyright details
出版社版權頁記錄2024年第3版及修訂歷史。平台產品ISBN與勘誤參考號不同,不因平台使用另一識別碼就替換既有紙本ISBN。
- No Starch Press — third-edition ISBN, date and contents
出版社確認第3版ISBN、2022年12月發行與20章結構。專案選擇及本站資料彙整任務屬獨立學習建議。
- Eric Matthes — third-edition corrections and project updates
作者維護依印次區分的勘誤與單獨的部署更新,不以動態網頁的舊導語推斷目前精確印次。
- MIT Press — Guttag third edition and format-specific ISBNs
MIT Press確認2021年第3版平裝ISBN 9780262542364及不同電子書ISBN、日期;計算與建模定位並非相依版本永久相容的保證。
- MIT Press — third-edition table of contents
官方目錄PDF確認函式第4章、結構化型別第5章、檔案第7章、測試第8章、例外第9章、pandas第23章;後段建模在此為選讀延伸。
- Python documentation — truth values, including zero and None
Python官方型別文件確認零與None在真偽測試中皆為假。本例函式、數字、錯誤反例與檢查由本站原創並已獨立執行。
- Python documentation — floating-point representation and accumulation limits
官方數值教程說明表示誤差與累積誤差。本頁小整數可精確核對,但一般浮點契約不保證重新分組後結果完全一致。
這些是本站建議的學習活動,並非大學官方作業,也不代表對每本書逐頁通讀。