01 / 導讀
導讀
引用
Downey, A. B. (2024). Think Python: How to Think Like a Computer Scientist (3rd ed.). O'Reilly Media. 官方免費版本:https://allendowney.github.io/ThinkPython/
章節概要
全書19章,每章都是一個 Jupyter 筆記本,可以在瀏覽器中透過 Colab 執行。第1至18章以術語表和習題結尾,大多數章節還有一節「除錯」,討論該主題常見的錯誤。
第1章:程式設計是一種思維方式
本章把程式設計看作一種思維方式,它兼具數學、工程和科學的特點。內容包括算術運算子、運算式、值與型別、字串,以及形式語言與自然語言的區別,並引入全書後續要用到的術語。
第2章:變數與語句
指派、狀態圖、變數名、import 語句、運算式與語句的區別、print、引數和註解。
第3章:函式
函式的定義與呼叫、形參、用 for 和 range 寫迴圈、局部變數、堆疊圖和回溯資訊。例子取自巨蟒劇團(Monty Python)的歌詞,章末討論為什麼值得編寫函式。
第4章:函式與介面
本章用海龜繪圖模組畫正方形、多邊形和圓,同時講解封裝、泛化、重構、開發計畫和文件字串,主題是設計彼此配合的函式介面。
第5章:條件與遞迴
整除與取模、布林運算式、if、else 以及鏈式和巢狀條件,然後是遞迴、遞迴函式的堆疊圖、無限遞迴和鍵盤輸入。
第6章:回傳值
有回傳值的函式與回傳 None 的函式、漸進式開發、布林函式、帶回傳值的遞迴、對遞迴的「信念之躍」、斐波那契數列和型別檢查。
第7章:迭代與搜尋
遍歷字串和檔案中的單字、更新變數、計數、in 運算子與線性搜尋,全章圍繞「有多少英語單字含字母 e」這一問題展開。本章還引入 doctest,習題中有 Spelling Bee 字謎。
第8章:字串與正規運算式
字串作為序列、切片、不可變性、比較與字串方法,隨後是寫檔案、查詢與替換、正規運算式和字串替換。習題使用文字遊戲 Wordle。
第9–11章:串列;字典;元組
三種核心資料結構。第9章講串列的運算、方法、排序、別名和串列引數;第10章把字典看作對映,講計數器、遍歷、累積串列和備忘錄;第11章講元組的不可變性、元組指派、作為回傳值的元組、引數打包、zip、排序和字典的反轉。習題中貫穿回文和變位詞等文字謎題。
第12章:文字分析與生成
先統計一部小說中的不同單字和詞頻,再講二元組、馬可夫分析和生成新文字。本章指出,這些演算法與大語言模型的某些部分相似。
第13章:檔案與資料庫
檔名與路徑、f-string、用 YAML 和 shelve 儲存資料、檢查等價檔案以及遍歷目錄。最後的習題是在目錄樹中查詢重複的照片。
第14–16章:類與函式;類與方法;類與物件
分三步介紹物件導向程式設計。第14章定義 Time 類,講屬性、純函式、原型與補丁以及先設計後開發;第15章把函式改寫為方法,並加入靜態方法、str、init 和運算子過載;第16章用 Point、Line 和 Rectangle 類講解等價與同一、深複製和多型。
第17章:繼承
以撲克牌和牌組為貫穿示例,再講父類與子類和特化,重點是牌的表示、比較和排序。
第18章:Python 補充內容
前面各章略去的特性:集合、Counter、defaultdict、條件運算式、串列綜合運算、any 與 all、具名元組和關鍵字引數打包。其「除錯」一節在 doctest 之外又介紹 unittest。
第19章:結語
繼續學習的建議:作者在資料科學和建模方面的其他著作、虛擬助手和其他開發環境等工具、Python 使用者組,以及再學一門語言,並推薦函式式語言。
核心概念
第1–6章:基礎、函式與遞迴
- 值、型別和運算式:談論程式所用的詞彙,最先引入,以便讀懂錯誤資訊和文件。
- 堆疊圖:函式呼叫幀的圖示,用來跟蹤局部變數和遞迴呼叫。
- 漸進式開發:以小步、可測試的方式構建函式,第6章再次運用。
第7–13章:字串、集合與檔案
- 線性搜尋:在序列中逐個查詢元素,即第7章的模式。
- 別名與可變性:多個名字指向同一個串列物件,以及元組和字串為何不能原地修改。
- 字典作為對映:按鍵直接查詢,用於計數、備忘錄和馬可夫分析。
- 持久化:透過檔案、YAML 和 shelve 使資料在程式執行結束後仍然保留。
第14–18章:物件與 Python 補充內容
- 程式設計師自定義型別:把資料和操作捆綁在一起的類。
- 純函式與方法:同一個操作先寫成函式,再移入類中。
- 繼承與多型:透過子類複用類,以及可處理不同類物件的程式碼。
- 測試:前面章節用 doctest,第18章加入 unittest。
評析
優點
- 有意縮小的語言子集。 前言說明,本書只講 Python 中用最少概念換取最大能力的部分,第18章則集中收錄被省略的便利特性。
- 有意識地教授術語。 術語在首次出現時即給出定義,並在每章末尾的術語表中複習;前言解釋說,初學者要學的第二件事就是談論程式所用的語言。
- 內建除錯與測試。 幾乎每章都有「除錯」一節,第三版還加入了 doctest 和 unittest,前言把這列為本版的改動之一。
- 練習兼顧操作與反思。 每章的習題都以「Ask a virtual assistant」一項開頭,示範如何核對助手的回答;後面的習題是文字謎題、文字生成、重複檔案搜尋和撲克牌遊戲,而不是抽象的操練。
- 免費且可直接執行。 文字採用創用 CC許可,筆記本無需安裝任何軟體即可在瀏覽器中執行。
侷限
- 範圍有意收窄。 作者說明本書並不涵蓋整個語言;書中沒有系統的演算法分析、對標準庫的廣泛介紹,也沒有大型專案。
- 依賴筆記本環境和虛擬助手。 本版圍繞 Jupyter 和虛擬助手編寫,偏好純文字編輯器加終端的讀者需要自行調整說明。
- 對有經驗的程式設計師起步偏慢。 前言提醒,已有大量 Python 經驗的讀者可能覺得前幾章太慢。
- 物件導向程式設計分階段引入。 第一個物件導向章節有意展示不地道的寫法,到第15章給出常用形式之前,讀者可能覺得有些迂迴。
在課程中的定位
在入門程式設計課程書單中,本書是一門精練的 Python 入門課,對術語、除錯和解決問題給予同等重視。最接近的替代品是 Python Crash Course:它更快進入較大的專案,包括遊戲、資料視覺化和網路應用,而 Think Python 則停留在小程式,以及這些程式背後的術語與習慣上。How to Design Programs 和 Structure and Interpretation of Computer Programs 沿著另一種傳統教程式設計,採用設計步驟和 Scheme 系語言,適合想獲得比某一語言專書更深概念基礎的讀者。
Guttag 的 Introduction to Computation and Programming Using Python 覆蓋面更廣,包括計算建模和資料分析,是讀完 Think Python 之後自然的下一步。The C Programming Language 的作用不同:在第一門語言已經熟練之後,從簡短而底層的角度看記憶體與型別。
如何使用本書
本書適合從未編過程式的人,也適合懂另一門語言而想學 Python 的人,不設先修要求。各章前後依賴,前言要求讀者按順序閱讀,並在繼續之前做完習題。
實用的安排是:先讀第1至6章,這是基礎(算術、函式、條件與遞迴);然後讀第7至13章,即字串、集合與檔案,這是日常 Python 的核心。第14至17章的物件導向程式設計可作為第二階段,主要寫指令碼的讀者可以讀完第14章後略讀。第18章最好在前面各章讓你想寫出更簡短的程式碼時再讀,第19章是簡短的後續建議清單。
在 Colab 中執行每一章,親手輸入示例而不是隻看,並完成習題,包括「除錯」各節。按書中的建議藉助助手獲取提示時,要測試它給出的程式碼,並與本章自己的做法對照。
版本與來源
本導讀依據第三版(2024),即作者在創用 CC許可下於 https://allendowney.github.io/ThinkPython/ 釋出的免費線上版本。內容基於前言、第1至18章的完整目錄與全部小節標題、各章引言,以及習題和結尾一章。
