索引 / 001 ZH-TW
Python程式設計思維:如何像電腦科學家一樣思考 cover

電腦科學

電腦科學

Python程式設計思維:如何像電腦科學家一樣思考

Allen B. Downey

英文原名: Think Python: How to Think Like a Computer Scientist

電腦科學和Python程式設計的清晰實用介紹,涵蓋基礎知識、資料結構、物件導向概念、演算法和問題解決。

難度等級
入門
學術層次
大學部
Python程式設計程式設計入門資料結構物件導向程式設計演算法思維電腦科學

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章的完整目錄與全部小節標題、各章引言,以及習題和結尾一章。