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 位眼光敏锐、思想深邃的读者提出了建议和更正。他们的贡献和对这个项目的热情对我们帮助很大。
如果你有任何建议或更正,请发送电子邮件至[email protected]. 如果我根据你的反馈进行了修改,我会将你添加到贡献者名单(除非你要求省略)。
如果你至少包含错误出现的句子的一部分,这将使我更容易搜索。页码和章节号也可以,但不太容易使用。谢谢!
- 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