Think Python/前言
(本節由 Allen B. Downey[1]編寫)
1999 年 1 月,我正在準備用 Java 教授一門入門程式設計課程。我已經教過三次了,我感到很沮喪。這門課的失敗率太高了,即使是那些成功的學生,他們的整體成就水平也太低了。
我發現其中一個問題是教材。它們太大了,包含了太多關於 Java 的不必要的細節,而關於如何程式設計的高階指導卻不夠。而且它們都存在“陷阱效應”:一開始很簡單,然後逐漸變得複雜,然後在第 5 章左右,底線就會掉出來。學生們會得到太多新的內容,而且太快了,我會花一學期的剩餘時間來彌補。
在開學前兩週,我決定自己寫一本教材。
我的目標是
- 保持簡短。學生讀 10 頁比讀 50 頁更好。
- 注意詞彙。我儘量減少術語,並在首次使用時定義每個術語。
- 逐步構建。為了避免陷阱,我將最難的話題分成一系列小步驟。
- 專注於程式設計,而不是程式語言。我包含了 Java 的最少有用子集,省略了其餘部分。
我需要一個標題,所以一時興起,我選擇了《像計算機科學家一樣思考》。
我的第一個版本很粗糙,但它起作用了。學生們閱讀了教材,並且他們理解得足夠多了,我可以在課堂上花時間講解難點、有趣的話題,以及(最重要的是)讓學生練習。
我根據 GNU 自由文件許可證釋出了這本書,該許可證允許使用者複製、修改和分發這本書。
接下來發生的事情是最酷的部分。弗吉尼亞州的一位高中老師 Jeff Elkner 採用了我的教材並將其翻譯成 Python。他給我寄了一份他的翻譯稿,我也有幸透過閱讀自己的教材來學習 Python。
我和 Jeff 修改了這本書,加入了 Chris Meyers 的案例研究,並在 2001 年釋出了《像計算機科學家一樣思考:用 Python 學習》,同樣是在 GNU 自由文件許可證下。作為 Green Tea Press,我出版了這本書,並開始透過 Amazon.com 和大學書店銷售實體書。Green Tea Press 的其他書籍可以在 greenteapress.com 上找到。
2003 年,我開始在奧林學院任教,我第一次有機會教授 Python。與 Java 相比,結果令人驚歎。學生們掙扎更少,學得更多,參與了更多有趣的專案,而且總體來說樂趣更多。
在過去的五年裡,我一直在不斷完善這本書,糾正錯誤,改進一些例子,並新增新的內容,尤其是習題。2008 年,我開始著手進行一次重大修訂——與此同時,我收到了劍橋大學出版社一位編輯的來信,他有意出版下一版。真是天時地利人和!
最終出版了這本書,現在標題改成了更低調的《Think Python》。一些變化包括
- 我在每章的末尾添加了一個關於除錯的部分。這些部分介紹了查詢和避免錯誤的一般技術,以及關於 Python 陷阱的警告。
- 我刪除了最後幾章關於列表和樹的實現部分。我仍然很喜歡這些主題,但我認為它們與這本書的其餘部分不一致。
- 我添加了更多習題,從簡單的理解測試到一些大型專案。
- 我添加了一系列案例研究——更長的例子,包含習題、解決方案和討論。其中一些基於 Swampy,這是我為課堂使用而編寫的一套 Python 程式。Swampy、程式碼示例和一些解決方案可以在 thinkpython.com 上找到。
- 我擴充套件了對程式設計開發計劃和基本設計模式的討論。
- Python 的使用更加地道。這本書仍然是關於程式設計的,而不是關於 Python 的,但現在我認為這本書從語言中獲得了更多價值。
我希望你喜歡使用這本書,並且它能幫助你學習程式設計,以及至少在一定程度上像計算機科學家一樣思考。
Allen B. Downey
馬薩諸塞州尼德姆
Allen Downey 是弗蘭克林 W. 奧林工程學院的計算機科學副教授。
首先也是最重要的是,我要感謝 Jeff Elkner,他將我的 Java 教材翻譯成 Python,這開啟了這個專案,並且讓我認識了最終成為我最喜歡的語言。
我還要感謝 Chris Meyers,他為《像計算機科學家一樣思考》貢獻了一些章節。
我還要感謝自由軟體基金會開發了 GNU 自由文件許可證,它使我和 Jeff 以及 Chris 的合作成為可能。
我還要感謝 Lulu 的編輯們,他們為《像計算機科學家一樣思考》付出了努力。
我感謝所有使用早期版本教材的學生,以及所有傳送了更正和建議的貢獻者(列在下面)。
我還要感謝我的妻子 Lisa,感謝她為這本書做出的貢獻,以及 Green Tea Press,以及其他所有事情。
在過去的幾年裡,超過 100 位眼光敏銳、思想深邃的讀者提出了建議和更正。他們的貢獻和對這個專案的熱情對我們幫助很大。
如果你有任何建議或更正,請傳送電子郵件至feedback@thinkpython.com. 如果我根據你的反饋進行了修改,我會將你新增到貢獻者名單(除非你要求省略)。
如果你至少包含錯誤出現的句子的一部分,這將使我更容易搜尋。頁碼和章節號也可以,但不太容易使用。謝謝!
- Lloyd Hugh Allen 糾正了第 8.4 節中的一個錯誤。
- Yvon Boulianne 糾正了第 5 章中的一個語義錯誤。
- Fred Bremmer 提交了第 2.1 節中的一個更正。
- Jonah Cohen 編寫了 Perl 指令碼,將這本書的 LaTeX 原始碼轉換為漂亮的 HTML。
- Michael Conlon 在第 2 章中提交了一個語法更正,在第 1 章中提交了一個風格改進,並且他發起了關於直譯器技術方面的討論。
- Benoit Girard 糾正了第 5.6 節中一個幽默的錯誤。
- Courtney Gleason 和 Katherine Smith 編寫了horsebet.py,它在早期版本的教材中被用作案例研究。他們的程式現在可以在網站上找到。
- Lee Harr 提交了比我們這裡有空間列出的還要多的更正,事實上,他應該被列為文字的主要編輯之一。
- James Kaylin 是一名使用這本書的學生。他提交了許多更正。
- David Kershaw 修復了損壞的catTwice第 3.10 節中的函式。
- Eddie Lam 提交了第 1、2 和 3 章中的許多更正。他還修復了 Makefile,以便它在第一次執行時建立索引,並幫助我們建立了一個版本控制方案。
- Man-Yong Lee 糾正了第 2.4 節中示例程式碼中的一個錯誤。
- David Mayo 指出第 1 章中“無意識地”這個詞需要改為“潛意識地”。
- Chris McAloon 提交了對第 3.9 和 3.10 節的幾個更正。
- Matthew J. Moelter 是一位長期貢獻者,他為這本書提交了大量的更正和建議。
- Simon Dicon Montford 報告了一個丟失的函式定義和第 3 章中的幾個錯別字。他還發現了第 13 章中increment
函式中的錯誤。
- John Ouzts 糾正了第 3 章中“返回值”的定義。
- Kevin Parks 提供了寶貴的評論和建議,關於如何改進這本書的釋出。
- David Pool 發現第 1 章術語表中有一個錯別字,以及友好的鼓勵。
- Michael Schmitt 糾正了關於檔案和異常的章節中的一個錯誤。
- Robin Shaw 指出第 13.1 節中存在一個錯誤,其中
printTime函式在沒有定義的情況下被用在一個示例中。 - Paul Sleigh 發現了第 7 章中的一個錯誤,以及 Jonah Cohen 的 Perl 指令碼(用於從 LaTeX 生成 HTML)中的一個錯誤。
- Craig T. Snydal 正在德魯大學的一門課程中測試教材。他貢獻了一些寶貴的建議和更正。
- Ian Thomas 和他的學生正在一門程式設計課程中使用教材。他們是第一個測試本書後半部分章節的人,他們做出了大量的更正和建議。
- Keith Verheyden 提交了第 3 章中的一個更正。
- Peter Winstanley 讓我們知道第 3 章中存在一個長期存在的拉丁語錯誤。
- Chris Wrobel 更正了關於檔案 I/O 和異常的章節中的程式碼。
- Moshe Zadka 為這個專案做出了寶貴的貢獻。除了編寫關於字典的章節的第一稿之外,他還
在本書的早期階段提供了持續的指導。
- Christoph Zwerschke 傳送了幾個更正和教學建議,並解釋了 gleich 和 selbe 之間的區別。
- James Mayer 給我們傳送了一大堆拼寫錯誤和排版錯誤,包括貢獻者名單中的兩個錯誤。
- Hayden McAfee 發現兩個示例之間可能存在一個令人困惑的不一致。
- 安吉爾·阿納爾是國際翻譯團隊的一員,負責西班牙語版本的文字翻譯。他還發現了英語版本中的一些錯誤。
- 陶希杜爾·霍克和萊克斯·別列日尼創作了第 1 章的插圖,並改進了許多其他插圖。
- 米歇爾·阿爾澤塔博士在第 8 章中發現了一個錯誤,並針對斐波那契數列和“老處女”遊戲提出了了一些有趣的教學意見和建議。
- 安迪·米切爾在第 1 章中發現了一個拼寫錯誤,在第 2 章中發現了一個示例錯誤。
- 卡林·哈維建議在第 7 章中進行澄清,並發現了一些拼寫錯誤。
- 克里斯托弗·P·史密斯發現了一些拼寫錯誤,並幫助我們準備更新 Python 2.2 版本的書籍。
- 大衛·哈欽斯在前言中發現了一個拼寫錯誤。
- 格雷戈爾·林格爾在奧地利維也納的一所高中教授 Python 語言。他正在進行德語版本的書籍翻譯,並發現了第 5 章中的一些嚴重錯誤。
- 朱莉·彼得斯在序言中發現了一個拼寫錯誤。
- 弗洛林·奧普里納提交了對makeTime函式的改進,對printTime函式的更正,以及一個不錯的拼寫錯誤修正。
- D.J.韋伯建議在第 3 章中進行澄清。
- 肯在第 8 章、第 9 章和第 11 章中發現了一堆錯誤。
- 伊沃·韋弗在第 5 章中發現了一個拼寫錯誤,並在第 3 章中建議進行澄清。
- 柯蒂斯·揚科建議在第 2 章中進行澄清。
- 本·洛根提交了一些拼寫錯誤,以及將書籍翻譯成 HTML 的問題。
- 傑森·阿姆斯特朗發現了第 2 章中缺少的單詞。
- 路易斯·科迪埃在第 16 章中發現了一個程式碼與文字不匹配的地方。
- 布萊恩·凱恩建議在第 2 章和第 3 章中進行一些澄清。
- 羅伯·布萊克提交了一堆更正,包括一些針對 Python 2.2 的更改。
- 巴黎中央理工學院的讓-菲利普·雷提交了一些補丁,包括一些針對 Python 2.2 的更新和其他深思熟慮的改進。
- 喬治·華盛頓大學的傑森·馬德爾提出了一些有用的建議和更正。
- 簡·岡托夫特-布魯恩提醒我們,“a error”本身就是一個錯誤。
- 亞伯·大衛和亞歷克西斯·迪諾提醒我們,“matrix”的複數形式是“matrices”,而不是“matrixes”。這個錯誤已經在書中存在了好幾年,但兩位同名首字母的讀者卻在同一天報告了它。真是奇怪。
- 查爾斯·塞耶建議我們刪除一些語句結尾處的分號,並清理我們對“引數”和“引數”的使用。
- 羅傑·斯佩伯格在第 3 章中指出了一個扭曲的邏輯。
- 薩姆·布林指出了第 2 章中一個令人困惑的段落。
- 安德魯·張指出了兩個“使用前定義”的例子。
- C. 科裡·卡佩爾發現了第三個除錯定理中缺少的單詞,以及第 4 章中的一個拼寫錯誤。
- 亞歷山德拉幫助澄清了一些關於“海龜”的困惑。
- 維姆·香檳在字典示例中發現了一個錯誤。
- 道格拉斯·賴特指出了arc.
- 函式中地板除法的一個問題。
- 賈裡德·斯賓多在句末發現了一些殘留物。
- 林佩亨傳送了一些非常有幫助的建議。
- 雷·哈格特維特提交了兩個錯誤和一個不算錯誤的錯誤。
- 托爾斯滕·許布什指出了 Swampy 中的不一致。
- 英格·佩圖霍夫修正了第 14 章中的一個例子。
- 阿內·巴本豪瑟海德傳送了一些有幫助的修正。
- 馬克·E·卡西達很擅長髮現重複的單詞。
- 斯科特·泰勒填補了一個缺少的單詞。然後提交了一堆修正。
- 戈登·謝潑德提交了一些修正,都分別在不同的電子郵件中。安德魯·特納發現了第 8 章中的一個錯誤。
- 亞當·霍巴特修正了arc.
- 函式中地板除法的一個問題。達里爾·漢蒙德和莎拉·齊默曼指出我過早地使用了math.pi。
- 喬治·薩斯在除錯部分發現了一個錯誤。
- 布萊恩·賓厄姆建議了練習 11.9。
- 莉婭·恩格爾伯特-芬頓指出我使用了tuple作為變數名,違反了我自己的建議。然後發現了一些拼寫錯誤和一個“使用前定義”的錯誤。
- 喬·馮克發現了一個拼寫錯誤。
- 曹超在斐波那契數列示例中發現了一個不一致。
- 傑夫·佩恩知道空格和垃圾郵件的區別。
- 魯博斯·平特斯提交了一個拼寫錯誤。
- 格雷格·林德和阿比蓋爾·海斯霍夫建議了練習 14.6。
- 馬克斯·黑爾佩林指出了 Python 3.0 中即將發生的變化。馬克斯是傑出的書籍《具體抽象》的作者之一,在你讀完這本書之後,你可能想讀一下這本書。
- 喬蒂帕特·波納瓦萊在錯誤訊息中發現了一個錯誤。
- 斯坦尼斯瓦夫·安托爾傳送了一份非常有用的建議清單。
- 埃裡克·帕什曼傳送了第 4-11 章的一些更正。
- 米格爾·阿澤維多發現了一些拼寫錯誤。
- 劉建華提交了一份很長的更正清單。
- 尼克·金髮現了一個缺少的單詞。
- 馬丁·祖特傳送了一份很長的建議清單。
- 亞當·齊默曼在我對“例項”的“例項”中發現了一個不一致,以及其他幾個錯誤。
- 拉特納卡爾·提瓦里建議用腳註解釋退化三角形。
- 阿努拉格·戈爾建議了
is_abecedarian函式的另一種解決方案,併發送了一些額外的更正。他還會拼寫簡·奧斯汀的名字。 - 凱利·克拉澤發現了其中一個拼寫錯誤。
- 馬克·格里菲斯指出了第 3 章中一個令人困惑的例子。
- 羅伊丹·翁吉在我的牛頓法中發現了一個錯誤。
2008 年 9 月,Whiteknight 將綠茶出版社[2] 的“Think Python” 的 HTML 版本轉換為華夏公益教科書[3] 上的維基文字版本。現在,任何人都可以改進文字。
- ↑ "這本書的奇特歷史" 由艾倫·B·唐尼著
- ↑ "Think Python" 在綠茶出版社
- ↑ 華夏公益教科書: Think Python