像计算机科学家一样思考Python(第2版)

978-7-115-42551-5
作者: 【美】Allen B. Downey(艾伦 B. 唐尼)
译者: 赵普明
编辑: 杨海玲
分类: Python

图书目录:

详情

本书以培养读者像计算机科学家一样的思维方式的思路来教授Python语言编程。作者从最基本的编程概念开始讲起,包括语言的语法和语义,而且每个编程概念都有清晰的定义,书中还探讨了如何处理文件和数据库,如何理解对象、方法和面向对象编程,如何使用调试技巧来修正语法错误、运行时错误和语义错误。每章都配有术语表和练习题,方便读者巩固所学的知识和技巧。每章都抽出一节来讲解如何调试程序。

图书摘要

版权信息

书名:像计算机科学家一样思考Python(第2版)

ISBN:978-7-115-42551-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [美] Allen B. Downey

  译    赵普明

  责任编辑 杨海玲

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Copyright ©2016 by O’Reilly Media, Inc.

Simplified Chinese Edition, jointly published by O’Reilly Media, Inc. and Posts & Telecom Press, 2016. Authorized translation of the English edition, 2016 O’Reilly Media, Inc., the owner of all rights to publish and sell the same. All rights reserved including the rights of reproduction in whole or in part in any form.

本书中文简体版由O’Reilly Media,Inc.授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程。贯穿全书的主体是如何思考、设计、开发的方法,而具体的编程语言,只是提供了一个具体场景方便介绍的媒介。

全书共21章,详细介绍Python语言编程的方方面面。本书从最基本的编程概念开始讲起,包括语言的语法和语义,而且每个编程概念都有清晰的定义,引领读者循序渐进地学习变量、表达式、语句、函数和数据结构。书中还探讨了如何处理文件和数据库,如何理解对象、方法和面向对象编程,如何使用调试技巧来修正语法错误、运行时错误和语义错误。每一章都配有术语表和练习题,方便读者巩固所学的知识和技巧。此外,每一章都抽出一节来讲解如何调试程序。作者针对每章所专注的语言特性,或者相关的开发问题,总结了调试的方方面面。

本书的第2版与第1版相比,做了很多更新,将编程语言从Python 2升级成Python 3,并修改了很多示例和练习,增加了新的章节,更全面地介绍Python语言。

这是一本实用的学习指南,适合没有Python编程经验的程序员阅读,也适合高中或大学的学生、Python爱好者及需要了解编程基础的人阅读。对于第一次接触程序设计的人来说,是一本不可多得的佳作。


O’Reilly Media通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。自1978年开始,O’Reilly一直都是前沿发展的见证者和推动者。超级极客们正在开创着未来,而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社会对新科技的应用。作为技术社区中活跃的参与者,O’Reilly的发展充满了对创新的倡导、创造和发扬光大。

O’Reilly为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了Make杂志,从而成为DIY革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽带。O’Reilly的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新产业的革命性思想。作为技术人士获取信息的选择,O’Reilly现在还将先锋专家的知识传递给普通的计算机用户。无论是通过书籍出版,在线服务或者面授课程,每一项O’Reilly的产品都反映了公司不可动摇的理念——信息是激发创新的力量。

业界评论

“O’Reilly Radar博客有口皆碑。”

——Wired

“O’Reilly凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。”

——Business 2.0

“O’Reilly Conference是聚集关键思想领袖的绝对典范。”

——CRN

“一本O’Reilly的书就代表一个有用、有前途、需要学习的主题。”

——Irish Times

“Tim是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照Yogi Berra的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”

——Linux Journal


1999年,我正在为一门Java的编程入门课程备课。这门课我已经教过3个学期,感到有些灰心。课程的不及格率太高,即使是那些及格的学生,也只获得了很低的成就。

我发现问题之一是教材。它们太厚,有太多冗余的细节,而针对编程技巧的高阶的指导却很不足。而且学生们都有“陷阱效应”的苦恼:开头时很容易,也能循序渐进,但接着在第5章左右,整个地板就突然陷落了。新内容来得太多、太快,以至于我必须花费一学期剩下的全部时间来帮助他们拾回丢失的片段。

开课前两周,我决定自己来编写教材。我的目标有以下几个。

我需要一个标题,所以心血来潮选择了“How to Think Like a Computer Scientist”。

第 1 版教材很粗糙,但确实有效。学生们读完课本,懂得了足够的基础知识,以至我甚至可以利用课堂时间和他们一起讨论更难、更有趣的话题,并且(最重要的是)可以让学生们有足够的时间在课堂上做练习。

我将这本书按照GNU自由文档许可协议(GNU Free Documentation License)发布,让用户可以复制、修改和分发本书。

接下来发生了最酷的事情。Jeff Elkner,弗吉尼亚州的一位高中老师,使用了我的书,并且将其翻译成Python语言的版本。他寄给我他的翻译副本,于是我有了一次很奇特的经历——通过读我自己的书来学习Python。通过绿茶出版社(Green Tea Press),在2001年我出版了第一个Python版本。

2003年,我开始在欧林学院(Olin College)教学,并第一次需要教授Python语言。和Java的对比非常惊人。学生们困扰更少,学会得更多,从事更有意思的项目,总的来说得到了更多的乐趣。

在那之后我一直继续拓展这本书的内容,修改错误,改进示例,并增加新的材料,尤其是练习。

结果就产生了本书,并改用了不那么宏伟堂皇的书名——Think Python。部分改动如下所述。

第2版增加了如下几个新特性。

我希望你喜欢这本书,并希望它至少能提供一点帮助,助你学会像计算机科学家那样编程和思考。

——Allen B. Downey

欧林学院

本书使用下列排版约定。

补充材料(代码示例、练习等)可以从http://www.greenteapress.com/thinkpython2/code下载。

本书的目的是帮你完成工作。一般来说,只要是本书提供的示例代码,你都可以用在自己的程序和文档中。如果你不是要复制大部分的代码,就不需要联系我们申请授权。例如,写一个程序,里面使用了本书中的几段代码,不需要申请授权。但销售或分发O’Reilly书籍的示例光盘则需要授权。回答问题中引用本书内容或示例代码,并不需要申请授权,但将本书中大量的代码引入你的产品文档则需要授权。

在引用本书内容时,我们并不强求但鼓励你注明出处。引用通常包括书名、作者、出版社和ISBN。例如:“Think Python, 2nd Edition by Allen B. Downey (O’Reilly). Copyright 2016 Allen Downey, 978-1-4919-3936-9”。

如果你觉得自己对本书代码示例的使用超出了上述授权范围,可以随时联系我们:permissions@oreilly.com。

请将关于本书的评论和问题发给出版商。

美国:

O’Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

我们为本书提供了专门的网页,上面有勘误表、示例,以及其他额外的信息,可以访问本书对应网页。

如果想对本书进行评论或想问技术问题,请将邮件发到bookquestions@oreilly.com。

想了解更多关于我们的书籍、课程、会议,以及新闻等信息,请登录O’Reilly 的网站。

我们的其他联系方式如下。

非常感谢Jeff Elkner,他将我的Java书翻译成Python,这使我我开始了这个项目,并向我介绍了Python语言,结果Python成为我最喜爱的编程语言。

还要感谢Chris Meyers,他在How to Think Like a Computer Scientist一书中贡献了好几节。

感谢自由软件基金会(Free Software Foundation)开发了GNU自由文档协议,让我和Jeff以及Chris的合作成为可能。感谢创用CC(Creative Commons)开发了我们现在使用的协议。

感谢Lulu,负责How to Think Like a Computer Scientist的编辑。

感谢O’Reilly Media负责Think Python一书的编辑。

感谢所有参与了本书早期版本编写的学生,以及所有(下面列出的)贡献者提供的修订和建议。

在最近几年中,超过100名眼光犀利、思维敏捷的读者给我寄来了建议和修订。他们对这个项目的贡献和热情,对我是极大的帮助。

如果你有建议或者修订意见,请发邮件到feedback@thinkpython.com。如果我根据你的回馈做出了修改,会将你加入贡献者列表中(除非你要求被隐藏)。

如果你给出错误出现的位置的部分语句,会让我更容易搜索。页码或者章节编号也可以,但并不那么容易处理。谢谢!


本书的目标是教会你像计算机科学家一样思考。这种思考方式综合了数学、工程学以及自然科学的一些最优秀的特性。计算机科学家与数学家类似,他们使用形式语言来描述理念(特别是计算);与工程师类似,他们设计产品,将元件组装成系统,对不同的方案进行评估选择;与自然科学家类似,他们观察复杂系统的行为,构建科学假说,并检验其预测。

作为计算机科学家,最重要的技能就是问题求解。问题求解是发现问题、创造性地思考解决方案以及清晰准确地表达解决方案的能力。实践证明,学习编程的过程,正是训练问题求解能力的绝佳机会。这也是本章标题用“程序之道”的原因。

一方面,你将学会编程,其本身就是一个非常有用的技能;另一方面,你可以使用编程作为工具,去达到更高的目标。随着本书的深入,那个目标会逐渐明晰。

程序是指一组定义如何进行计算的指令的集合。这种计算可能是数学计算,如解方程组或者查找多项式的根,也可以是符号运算,如搜索和替换文档中的文本,或者图形相关的操作,如处理图像或播放视频。

在不同的编程语言中,程序的细节有所不同,但几乎所有编程语言中都会出现以下几类基本指令。

信不信由你,这差不多就是全部了。你所遇到过的所有程序,无论多么复杂,都是由类似上面的这些指令组成的。所以我们可以把编程看作一个将大而复杂的任务分解为更小的子任务的过程,不断分解,直到任务简单到足以由上面的这些基本指令组合完成。

Python入门的挑战之一在于你可能需要自己在电脑上安装Python及相关软件。如果你熟悉自己的操作系统,而且习惯于命令行界面,那么安装Python不是什么问题。但对于初学者来说,同时学习编程和系统管理命令两件事,有时候是非常痛苦的。

为了避免这个问题,我推荐你开始先在浏览器中运行Python,等熟悉了Python语言之后,我再向你介绍如何在电脑上安装Python。

用于运行Python的网站有不少。如果你已经找到一个喜欢的,就可以直接去用。如果没有,我推荐PythonAnywhere。

有两个版本的Python,分别为Python 2和Python 3。它们很类似,所以如果你学会了一个版本,也能很容易地切换到另一个版本。实际上,作为初学者,你会遇到的两者之间的区别非常少。本书是针对Python 3编写的,但我也会给出一些关于Python 2的注意事项。

Python解释器是一个读取并执行Python代码的程序。根据所在环境的不同,你可能需要点击程序图标,或者在命令行中键入python命令来启动解释器。当它启动以后,可以看到如下输出:

Python 3.4.0 (default, Jun 19 2015, 14:20:21)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

前3行文本包含了解释器和所运行的操作系统的信息,所以可能与你看到的有些区别。但你应当检查版本号是否以3开头(本例所示的是3.4.0),表示你使用的是Python 3的解释器。如果版本号以2开头,那么(你肯定猜到了)解释器是Python 2。

最后一行是一个提示符,表明解释器已经准备好,等待你键入代码。如果你键入一行代码并按下Enter键,解释器会显示结果:

>>> 1 + 1
2

依照传统,用新语言编写的第一个程序叫“Hello, World!”,因为这个程序所做的事情就是只显示“Hello, World!”。在Python中,它是这个样子:

>>> print('Hello, World!')

这是print语句的一个示例。print并不会真往纸上打印文字,而是在屏幕上显示结果。在这个例子中,输出的结果是:

Hello, World!

程序中的引号表示要显示的文本的开始和结束,在输出结果中它们并不显示。

括号表示print是一个函数。我们将在第3章中讨论函数。

在Python 2中,print语句略有不同。它不是一个函数,所以不使用括号:

>>> print 'Hello, World!'

这个区别的意义在后面会慢慢显现,但现在只需要知晓就足够了。

介绍完“Hello, World”之后,接下来是算术操作。Python提供了操作符,即像加号或减号这样的用来表达计算操作的特殊符号。

操作符+、-和*分别表示进行加法、减法和乘法运算,如下面示例所示:

>>> 40 + 2
42
>>> 43 – 1
42
>>> 6 * 7
42

操作符/表示除法运算:

>>> 84 / 2
42.0

这里你可能会奇怪为什么结果是42.0而不是42。我会在下一节解释。

最后,操作符**表示进行指数运算。也就是说,会把一个数按指数进行乘方:

>>> 6**2 + 6
42

在其他一些语言中,指数操作用^符号表示,但在Python中^这个符号已经用来表示二进制按位运算XOR了。如果你不熟悉按位运算,结果可能会让你感到奇怪:

>>> 6 ^ 2
4

本书不会讨论按位操作符,读者可以自行阅读相关文档。

(value)是程序操作的最基本的东西,如一个字母或者数字。前面我们见过一些值,如242.0以及'Hello,World!'

这些值属于不同的类型(type):2整型(integer)的,42.0浮点型(floating-point)的,而'Hello,World!'字符串(string)类型的,这么称呼是因为它是由一堆字母“串连”起来的。

如果不确认一个值的类型,解释器可以告诉你:

>>> type(2)
<class 'int'>
>>> type(42.0)
<class 'float'>
>>> type('Hello, World!')
<type 'str'>

在这些结果中,单词“class”(类)被用于某一类型中,这是一种值类型。

不足为奇,整数属于'int'类型, 字符串属于'str'类型,而浮点数属于'float'类型。

那么'2''42.0'这样的值呢?它们看起来像是数字,但又使用字符串常用的引号括起来:

>>> type('2')
<type 'str'>
>>> type('42.0')
<type 'str'>

它们是字符串。

当输入一个很大的数字时,你可能会忍不住想在数字中间加上逗号,就像1,000,000这样。在Python中这并不是合法的整数,但它凑巧又是一个合法的表达式:

>>> 1,000,000
(1, 0, 0)

当然,这和我们预期的完全不同!Python把1,000,000解释成一个用逗号分隔的整数序列。关于这种序列在本书后面可以学到更多内容。

自然语言是指人们所说的语言,如英语、西班牙语和法语。它们不是由人设计而来的(虽然人们会尝试加以语法限制),而是自然演化而来的。

形式语言则是人们为了特殊用途设计的语言。例如,数学上使用的符号体系是一种特别擅于表示数字和符号之间关系的形式语言;化学家则使用另一种形式语言来表示分子的化学结构。而最重要的是:

编程语言是人们为了表达计算过程而设计出来的形式语言。

形式语言倾向于对语法做出严格的限制。例如,3 + 3 = 6是语法正确的数学表达式,但3+ = 3$6则不是。H2O是语法正确的化学方程式,而2Zz则不是。

语法规则有两种,分别适用于记号(token)和结构(structure)。记号是语言的基本元素,如词、数字和化学元素。3+ = 3$6的一个问题就是$在数学表达式中(至少就我所知)不是合法记号。相似地,2Zz不合法是因为并不存在缩写为Zz的化学元素。

第二种语法规则指定记号所组合的方式。数学等式3+ = 3不合法,因为虽然+和=是合法记号,但不能将它们连续放置。相似地,在化学表达式里,下标数字应该出现在元素名称之后,而不是之前。

“This is @ well-structured Engli$h sentence with invalid t*kens in it.”是一个结构良好,但包含非法记号的英语语句。“This sentence all valid tokens has, but invalid structure with.”这句话所有的记号都合法,但是语句结构不合法。

当你阅读英语的句子或形式语言的语句时,需要弄清句子的结构是什么(虽然在自然语言中这个过程是下意识完成的)。这个过程称为语法分析

虽然形式语言和自然语言有很多共同的特点——记号、结构、语法以及语义,但它们也有一些区别。

因为我们都说着自然语言长大,有时候很难适应形式语言。在某种意义上,形式语言和自然语言的区别与诗词和散文的区别类似,而且程度更甚。

形式语言的密度远远大于自然语言,所以阅读起来需要花费更多的时间。还有,结构非常重要,所以直接自顶向下、从左至右的阅读顺序并不一定是最好的。相反,要试着学会在头脑中解析程序,辨别出记号并解析出结构。最后,细节很重要。在自然语言中常常可以忽略的小错误,如拼写错误或者标点符号错误,在形式语言中往往会造成很大的差别。

程序是很容易出错的。因为某种古怪的原因,程序错误被称为bug,而查捕bug的过程称为调试(debugging)。

一个程序中可能出现3种类型的错误:语法错误、运行时错误和语义错误。对它们加以区分,可以更快地找到错误。

编程,特别是调试,有时候会引发强烈的情绪。如果你挣扎于一个困难的bug,可能会感觉到愤怒、沮丧以及窘迫。

有证据表明,人们会像对待人一样对待电脑。当电脑良好完成工作时,我们会把它们当作队友,而当它们难以控制、粗暴无礼的时候,我们会按照对待那些粗暴固执的人一样对待它们(The Media Equation: How People Treat Computers, Television, and New Media Like Real People and Places,Reeves和Nass著)。

对这些反应行为有所准备,可能会帮助你更好地对待电脑。一种方法是把它当作你的雇员,它有一定的长处,如速度和精度,也有特定的弱点,如没有同情心和无法顾全大局。

你的任务是做一个好经理:设法扬长避短,并找到方法控制你的情绪去面对问题,而不是让你的反应影响工作效率。

学习调试可能会带来挫折感,但它是一个有价值的技能,并在编程之外还有很多用途。每章的结尾处都有一节类似于本节的关于调试技巧的讨论。希望它们能带来帮助!

问题求解(problem solving):总结问题、寻找解决方案以及表达解决方案的过程。

高级语言(high-level language):设计来方便人们读写的编程语言,如Python。

低级语言(low-level language):设计来方便计算机执行的编程语言,也被称为“机器语言”或“汇编语言”。

可移植性(portability):程序的一种属性:可以在多种类型的计算机上运行。

解释器(interpreter):一个读取其他程序并执行其内容的程序。

提示符(prompt):解释器显示的文字,提示用户已经准备好接收用户的输入。

程序(program):一系列代码指令的集合,指定一种运算。

print语句(print statement):一个指令,可以通知Python解释器在屏幕上显示一个值。

操作符(operator):一种特殊符号,用来表达加法、乘法或字符串拼接等简单运算。

(value):程序操作的数据基本单位,如一个数字或一个字符串。

类型(type):值的类别。到目前为止我们已经见过的类型有整数(int)、浮点数(float)和字符串(str)。

整型(integer):用来表示整数的类型。

浮点型(floating-point):用来表示带小数部分的数的类型。

字符串(string):用来表示一串字符的类型。

自然语言(natural language):自然演化而来的人们所说的语言。

形式语言(formal language):人们设计为某些特定目的(如表达数学概念或者计算机程序)设计的任何一种语言。所有编程语言都属于形式语言。

记号(token):程序的语法结构的最基本单位,类似于自然语言中的词。

语法(syntax):用于控制程序结构的规则。

语法分析(parse):检查程序并分析其语法结构。

bug:程序中的错误。

调试(debugging):发现和纠正bug的过程。

练习 1-1

在计算机前阅读本书是一个好主意,因为你可以边看边试验书中的示例。

每当你试验新的语言特性时,应当试着故意犯错。例如,在“Hello,World!”程序中,如果少写一个引号,会发生什么?如果两个引号都不写,会怎么样?如果把print拼写错了,会如何?

这种试验会帮你记住所读的内容,也能帮你学会调试,因为这样能看到不同的出错消息代表着什么。现在故意犯错总比今后在编码中意外出错好。

1.在print语句中,如果漏掉一个括号,或者两个都漏掉,会发生什么?

2.如果正尝试打印一个字符串,那么若漏掉一个或所有的引号,会发生什么?

3.可以使用一个负号来表示负数,如-2。如果在数字之前放一个正号,会发生什么?如果是2++2呢?

4.在数学标记里,前置0是没有问题的,如02。在Python中也这么做会发生什么?

5.如果在两个值之间不放任何操作符,会发生什么?

练习1-2

启动Python解释器,把它当作计算器使用。

1.在42分42秒中,一共有多少秒?

2.10千米相当于多少英里?提示:1英里相当于1.61千米。

3.如果你用42分42秒跑完10千米,那么你的平均速度(跑1千米需要的分钟和秒数)是多少?平均速度是多少千米每小时?

[1] “The penny dropped”在英语里的意思是:经过一段困惑后,突然理解了某个事情。——译者注

相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程