學習指南 /

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表示遺漏;兩者在真偽測試中皆為假,因此篩選條件必須明寫資料規則。

實作函式前應說明什麼?

規定可接受輸入、回傳輸出與邊界行為。本例省略沒有有效讀數的站點,不改變呼叫者的資料;沒有有效值不代表平均為零。

六步學習與具體成果

勾選用於自我記錄,並非成績評定;標記不會傳送給本站。

  1. 1. 預測短運算式並檢查型別

    建議閱讀範圍: Think Python 第1–2章;Crash Course 第1–2章;Guttag 第1–2章。

    動手產出: 寫一份小腳本或筆記本,列出數值、字串、比較與除法的六個運算式。執行前寫預期值與型別,再解釋不一致處。

    檢查標準: 看到輸出不等於理解;能區分數字、數字印出後的文字,以及輸入取得的字串。

  2. 2. 把資料規則轉為條件

    建議閱讀範圍: Think Python 第5、7章;Crash Course 第4–5、7章;Guttag 第2.3–2.6節。

    動手產出: 先手動追蹤下方資料,標示零值與遺漏值是否計入,再寫一個每列只走訪一次的迴圈。

    檢查標準: 保留零,只略過None;換序不改變哪些觀測有效,也不在走訪時刪除原集合的項目。

  3. 3. 為計算寫下契約

    建議閱讀範圍: Think Python 第3、6章;Crash Course 第8章;Guttag 第4章。

    動手產出: 實作前先寫函式的輸入、輸出、空輸入行為,把回傳結果與印出友善報告分開。

    檢查標準: 他人不必在提示框輸入就能呼叫函式,回傳值可供後續運用,原始輸入維持不變。

  4. 4. 依鍵累加後,再算平均

    建議閱讀範圍: Think Python 第9–10章;Crash Course 第3–4、6章;Guttag 第5章。

    動手產出: 依完整例題分別維護總和與計數字典,新增一個站點,追蹤第一筆有效讀數如何建立項目。

    檢查標準: 每筆有效紀錄只對其站點加一次總和、一次計數;分母不是站點數,也不能包含遺漏紀錄。

  5. 5. 讓檔案與失敗可被辨識

    建議閱讀範圍: Think Python 第8、13章;Crash Course 第10章;Guttag 第7、9章。

    動手產出: 儲存小型本機測試資料,另外寫載入器,交代空白、格式錯誤、非數字欄位的處理,不將這些決定偷偷混入已約定的平均函式。

    檢查標準: 檔案載入失敗須回報,不靜默偽裝為成功的空結果。使用虛構資料,不需個資或正式系統紀錄。

  6. 6. 交付可重現的小專案

    建議閱讀範圍: 重讀 Think Python 第7、9章;Crash Course 第11章;Guttag 第8章。

    動手產出: 提交函式、測試資料、測試與執行說明,檢查基準、空輸入、全遺漏、只有零、輸入不變,以及換序或整體重複。

    檢查標準: 預期答案應獨立手算,不能從程式輸出抄回測試。讀者可重跑並辨識未支援輸入,少數案例通過不表示已適合正式營運。

原創例題與解析

零是讀數,None不是

對資料[("A", 12), ("B", None), ("A", 0), ("B", 8), ("A", 18)],回傳各站點有效讀數的平均。保留零、略過None,省略沒有有效讀數的站點,且不更動原資料。

前提假設

每列包含字串站點與有限整數/浮點數或None;布林值、格式錯誤列、NaN不屬於本例輸入契約。讀數使用同一任意單位。空輸入或全遺漏輸入回傳空字典。這是虛構教學資料。 讀數大小與紀錄數量亦須確保各站點的累加總和維持有限;這個簡單浮點計算不處理溢位,也不保證所有有限輸入都能精確計算。

  1. 先看資料:A有12、0、18,總和30,共3筆;B僅有有效讀數8,None既不貢獻數值,也不貢獻計數。
  2. 分別建立總和、計數字典,走訪時以value is None決定是否略過,不使用if value判定有效性。
  3. 每筆有效紀錄加入相應站點的總和,並使其計數加一;迴圈後,各總和除以各自計數。
  4. A得到30 / 3 = 10.0,B得到8 / 1 = 8.0。從未有有效觀測的站點沒有總和、計數項目,會被省略,因此沒有零分母。
  5. 若錯用真偽值篩選,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)],保留輸入與缺失規則。若不保存原始資料,怎樣合併批次摘要得到各站點平均?直接平均批次平均是否足夠?本題使用可精確表示的小整數。

  1. batch1得到A:(總和12,計數2),B沒有有效摘要;batch2得到A:(18,1)、B:(8,1)。沒有摘要不等於測得零。
  2. 逐站點相加總和與計數,得A:(30,3)、B:(8,1),最後除一次得A10.0、B8.0,與一起處理原始資料相同。
  3. A的兩個批次平均為6與18,直接平均得12,因批次樣本數不同而錯誤。加權平均(2×6+1×18)/(2+1)=10才與合併結果一致。

答案與解釋

每批為每站點保留(總和,計數),分別相加後再除。只有平均而無計數,通常無法恢復合併平均。本題回傳{"A":10.0,"B":8.0}。

檢驗結果

把一筆資料移到另一批重算:這些小整數的合併平均不變,但批次平均的簡單平均可能變化。一般浮點輸入在數學上重新分組,並不保證逐位相等;還須單獨評估捨入與有依據的誤差界限。

常見誤區

輸出合理,不代表程式正確

錯誤答案A = 15.0也很平常。保留能區分預期規則與常見錯誤實作的手算案例。

把教材版本當作軟體環境

章節對應特定版次,相依套件與託管說明卻會演變。記錄實際Python與套件版本,部署前查作者更新。

未隔離邏輯就加入套件

平均函式只需內建功能。先獨立測試,再連接繪圖、CSV載入或網頁,否則環境與邏輯錯誤更難區分。

進入下一階段之前

  • 能選擇概念、作品或建模導向的主教材,並說明哪些內容先暫緩。
  • 能追蹤完整函式、解釋零與None的差異,以及站點沒有有效讀數時的結果。
  • 小專案具備獨立預期值、邊界檢查與執行說明,不把少量成功案例視為普遍正確的證明。

來源與版次核驗

來源核驗日期:

這些是本站建議的學習活動,並非大學官方作業,也不代表對每本書逐頁通讀。

編輯與選書方法 →