资源描述
1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.151.161.171.181.191.20目錄简介第一章编程之路第二章变量,表达式,语句第三章函数第四章案例学习:交互设计第五章条件循环第六章有返回值的函数第七章迭代第八章字符串第九章案例学习:单词游戏第十章列表第十一章字典第十二章元组第十三章案例学习:数据结构的选择第十四章文件第十五章类和对象第十六章类和函数第十七章类和方法第十八章继承第十九章更多功能2ThinkPython第二版,基于Python3原作者AllenB.Downey翻译CycleUser在线阅读地址=译者的话这是一本很经典的Python入门教材,也是一本很适合初学者的编程入门书籍。网上有过一些翻译,不过我觉得都还是自己动手来尝试一下,这样更有利于深入了解和体验,所以就再造轮子了。作者的话这是ThinkPython这本书的第二版,本次使用的是Python3,与Python2有很多不同,这些不同之处会有标注。如果你用Python2的话,还是建议你去阅读上一个版本。读者可以到亚马逊购买本书;或者下载ThinkPython2ePDF格式的电子版.;也可以在线阅读ThinkPython2eHTML网页版本(推荐这个,都是文字格式,更方便).样例代码以及其他问题的解决可以到这里找(具体样例的链接在书中就有)。简要介绍ThinkPython这本书是面向初学者介绍Python编程。首先介绍的是一些编程的基本内容,给出概念和解释,然后循序渐进地深入讲解每个概念。复杂的部分,比如递归以及面向对象编程,这些都分成一个个小块,以多个章节的方式来逐步介绍。第二版的更新简介3开始用Python3:书里面所有样例都用Python3来实现,参考代码也都做了升级,用Python2或者3都能运行。去掉了一些比较难的内容:基于读者反馈,我们认识到大家存在某些困难,所以就调整或者去掉了一些难点。浏览器内能Python编程了:初学者遇到的第一个困难就是安装Python。另外有的读者可能不想去直接就安装Python,我们就提供了一个用浏览器来运行Python的简介:使用PythonAnywhere,一个免费的在线Python编程环境。(译者注:中国用户以考虑试试,也有类似的实现,还有视频的介绍。)引入了更多的Python特性:单独加了一章来介绍一些第一版中没有提及的Python功能,比如列表解析和附加的数据结构。这本书是一本自由的书,遵循创作共用署名-非商业性使用-第三版协议,这意味着你可以自由地复制、分发和修改他,只要你有所贡献,并且不用于商业目的,就可以。如果你有一些评论、修正或者建议,可以发邮件给。其他由AllenDowney编写的自-和谐-由书籍都可以在GreenTeaPress找到.英文原版下载编译好的PDF版本在这里下载:PDF。LaTeX代码在GitHub这里可以下载:thisGitHubrepository.过往历史第一版在这里,是由剑桥大学出版社出版的,标题是PythonforSoftwareDesign.可以到亚马逊去买到。本书的原始版本由GreenTeaPress出版,标题为HowtoThinkLikeaComputerScientist:LearningwithPython.这个版本可以从L这个网站找到。其他由AllenDowney编写的自由书籍都可以在GreenTeaPress找到.前言本书的奇幻历史在1999年1月的时候呢,我正准备教一门Java的入门编程课。我当时已经教过三次了,受挫感很强。班上挂科率特别高,而且即使那些没挂科的学生编程的整体水平也特别低。简介4当时有很多问题,首先我就发现教材不太好用。那些教材都特别大部头,有很多关于Java的细节,特别琐碎又并不重要,而且也没有足够的关于如何编程的高层次指导(译者注:就是缺乏战略性指导,没有告诉学生编程的心法)。这些教材总有一些陷阱门效应:开头他们都却是挺简单,然后逐步提升,接着突然在某个地方,比如第五章,出现很坑很复杂的陷阱。学生们要突然一下子应对太多新东西,甚至措手不及,而我作为教师就得花费整个后半个学期来一点点给学生们补上。开课的两周之前,我最终决定要写个自己的教科书。目标如下:简短。让学生读10页就够比让他们读50页效果好得多。降低词汇难度。我尽量把术语用量降到最低,并且在首次使用的时候对每一个都进行定义。循序渐进。为了避免陷阱门效应,我专门把这些最为复杂的部分抽离成一个个专题,并且都切分成小规模的部分,一步步来进行。专注于编程,而不是编程语言。我只保留了关于Java的最小规模内容,没有涉及更多的细节。我还需要个标题,就突发奇想,选了个标题叫做如何像计算机科学家一样思考。我的第一版教材很粗糙,不过用起来效果还不错。学生真能看得进去,并且理解了我在课上所讲的那些难点和有趣的专题,最重要的是,他们能够根据这本教材来实践。之后我就以GNU自由文档协议来发布了这本书,这一协议允许所有人去复制、修改以及分发这本书。接下来的事情很有趣了。JeffElkner,维吉尼亚的一位高中教师,他很欣赏我这本书,把这本书从Java翻译成了Python的版本。他发给我一份译稿,然后我开启了阅读自己的书来学习Python的奇妙经历。于是在2001年,我通过GreenTeaPress出版了本书的第一个Python版本。在2003年,我开始在奥林商学院教学,并且第一次开始教Python了。这和Java的对比很鲜明。学生们省力多了,学得也更多了,在有趣的项目上也更努力,整体上都觉得这一学习过程很有乐趣。从那以后,我就继续维护这本书,修正错误,改进样例、附加资料以及练习题。结果就产生了现在这本书,现在标题简化了很多ThinkPython。主要的改变如下:在每一章的末尾,我加了关于debug的部分。这些内容提供了关于debug的一些整体策略,比如如何找到和避免bug,还有就是关于Python一些陷阱进行了提醒。我加了更多的练习,从简单的理解方面的测试,到一些比较充足的项目。大多数练习都有解决方案的样本链接。简介5我还添加了一些案例研究,包含练习、解决方案和讨论的更大规模的样例。此外我还扩展了关于程序开发规划和基本设计模式的讨论。关于debug和算法分析,还额外加了一些附录。这本ThinkPython的第二版有如下的新内容:本书内的所有参考代码都升级到Python3了。我增加了一部分内容,以及一些关于web方面的细节,这是为了帮助初学者能够在浏览器中开始尝试Python,这样即便你不想安装Python也没问题了。在第四章的第一节,我把我自己的一个原来叫做Swampy的小乌龟图形包转换撑了一个更标准的Python模块,名字叫做turtle,更好安装,功能也比之前强大了。我还添加了新的一章,叫做彩蛋,介绍了一些Python的额外功能,严格来说,这些功能并不算必备的,但有时候蛮好用的。我希望大家能享受学习这本书的过程,也希望这本书能帮助大家学习编程,并且让大家学会像计算机科学家一样思考,哪怕有一点点也好。本书英文版原作者:AllenB.Downey(艾伦唐尼)OlinCollege奥林商学院致谢非常感谢JeffElkner,是他把我的Java教材翻译成了Python,才引起了这一项目的开始,并且也把Python语言介绍给我,它已经是我最喜欢的编程语言了。也要感谢ChrisMeyers,他对如何像计算机科学家一样思考的一些章节有贡献。感谢自由软件基金会,是他们提出了GNU自由文档协议,在这一协议的帮助下,我和Jeff以及Chris的合作成为了可能,当然也要感谢我现在使用的知识共享协议。感谢Lulu的编辑们,他们出版了如何像计算机科学家一样思考。感谢OReilly公司的编辑们,他们出版了这本ThinkPython。最后还要感谢所有曾对本书早期版本做出过贡献的同学们,以及其他参与改错和提出建议的朋友们(列表如下)。贡献列表有几百名读者,他们目光敏锐又思维迅捷,在过去的这些年里提供了各种建议,发现了各种错误。他们贡献和热情都是对本项目的巨大帮助。如果大家有任何意见建议,请发邮件到联系我们。如果基于反馈做出了修改,我会将你添加到贡献列表(当然你不想被添加也可以的)。简介6希望你能至少把出错句子的一部分提供出来,这都让我更容易去搜索。页码和章节编号也可以,但不太容易找。多谢了!(译者注:以下贡献列表省略不在此处提供,有兴趣的朋友可以去看英文原版。)简介7第一章编程之路本书的目的是教你学会像计算机科学家一样来思考。这种思考方式汇聚了数学、工程和自然科学的精华。计算机科学家像数学家一样,使用规范的语言来阐述思想(尤其是一些计算);像工程师一样设计、组装系统,并且在多重选择中寻找最优解;像自然科学家一样观察复杂系统的行为模式,建立猜想,测试预估的结果。计算机科学家唯一最重要的技能就是解决问题。解决问题意味着要有能力把问题进行方程化,创造性地考虑解决思路,并且清晰又精确地表达出解决方案。而学习编程的过程,正是一个培养这种解决问题能力的绝佳机会。本章的标题是编程之路,原因就在此。在一定层面上,大家将通过编程本身来学习编程这一重要的技巧。在另外一些层面上,大家也将把编程作为实现一种目的的途径。这一目的会随着我们逐渐学习而越发清楚。1.1程序是什么?程序是一个指令的序列,来告诉机器如何进行一组运算。这种运算也许是数学上的,比如求解一组等式或者求多项式的根;当然也可以是符号运算,比如在文档中搜索和替换文字,或者一些图形化过程,比如处理图像或者播放一段视频。不同编程语言的具体细节看着很不一样,但几乎所有编程语言都会有一些基础指令:输入系统:从键盘、文件、网络或者其他设备上获得数据。输出系统:将数据在屏幕中显示,或者存到文件中、通过网络发送等等。数学运算:进行基本的数学操作,比如加法或者乘法。条件判断:检查特定条件是否满足来运行相应的代码。重复判断:重复进行一些操作,通常会有些变化。大家刚开始接触编程的话,可能还有点难以置信,核心内容仅仅上述这些而已。你用过的所有程序,无论多么复杂,都是由一些这样的指令组合而成的。因此大家可以把编程的过程理解成一个把庞大复杂任务进行拆分来解决的过程,分解到适合使用上述的基本指令来解决为止。1.2运行Python第一章编程之路8新手在刚接触Python的时候遇到的困难之一就是必须在电脑上安装Python和相关的一些软件。如果你熟悉操作系统,并且还很习惯用命令行接口,那安装Python对你来说就没啥问题了。但对初学者来说,要求他们既要了解系统管理又要学习编程,就可能有些困难了。为了避免这种问题,我推荐大家可以在开始的时候用浏览器来体验Python。熟悉了之后,再安装Python到计算机上。有很多站点提供在线运行Python的功能。如果你已经用过并且有一定经验了,可以选择你喜欢的。我推荐大家可以试试PythonAnywhere,对此的使用介绍可以在这个链接中找到。Python现在有两个主要的分之,即Python2和Python3。如果你学过其中的一个,你会发现他们还挺相似的,而且转换起来也不算难。实际上对于初学者来说,他们只有很细微的差别而已。这本书是用Python3写的,但也会对Python2进行注解。Python的解释器是一个读取并执行Python代码的程序。根据你的系统环境,你可以点击图标或者在命令行中输入python来运行解释器。它运行起来,你会看到类似这样的输出:Python3.4.0(default,Jun192015,14:20:21)GCC4.8.2onlinuxTypehelp,copyright,creditsorlicenseformoreinformation.开头的三行包含了关于解释器和所在操作系统的信息,所以大家各自的情况可能有所不同。不过当你检查版本的时候,比如例子中的是3.4.0,使用3开头的,那就告诉你了,他运行的是Python3。你肯定也能猜到,如果开头的是2那就是Python2咯。最后一行那个是提示符,告诉你解释器已经就绪了,你可以输入代码了。如果你输入一行代码然后回车键,解释器就会显示结果了,如下所示:1+11+12现在你已经做好开始学习Python的准备了。现在我估计你应该已经知道怎么来启动Python解释器和运行Python代码了。1.3第一个程序传统意义上,大家学一门新编程语言要写的第一个程序都被叫做Hello,World!,因为这第一个程序就用来显示这个词组Hello,World!。在Python中,是这样实现的:第一章编程之路9print(Hello,World!)Hello,World!这是一个打印语句的例子,虽然并没有往纸张上面进行实际的打印。这个程序把结果显示在屏幕上。结果就是输出了这个词组Hello,World!括号表明了print是一个函数。关于函数我们到第三章再讨论。在Python2中,打印的语句有一点点不一样:print不是一个函数,所以就不用有括号了。printHello,World!Hello,World!这个区别以后会理解更深入,现在说这点就够了。1.4运算符在Hello,World!之后,下一步就是运算了。Python提供了运算符,就是一些用来表示例如加法、乘法等运算的符号了。运算符+,-和*表示加法、减法和乘法,如下所示:40+240+24243-143-1426*76*742运算符右斜杠/意味着除法:84/284/242.0你估计在纳闷为啥结果是42.0而不是42,这个下一章节我再解释。最后,再说个运算符*,它表示乘方,就是前一个数为底数,后一个数为指数的次幂运算:第一章编程之路106*2+66*2+642在其他的一些编程语言中,这个符号是乘方的意思,但在Python中这是一个位运算操作符叫做异或。要是你不熟悉位运算操作符,结果一定让你很惊讶:62624我在本书中不会涉及到位运算,但你可以在下面这个链接里面读一下来了解:Wiki。1.5值和类型值就是一个程序操作的基本对象之一,比如一个字母啊,或者数字。刚刚我们看到了一些值的例子了,比如2,42.0,还有那个字符串Hello,World!这些值属于不同的类型:2是一个整形值,42.0是浮点数,Hello,World!是字符串咯。之所以叫字符串就是因为有一串字符。(译者注:这本书的作者真心掰开揉碎地讲解每一个点啊,高中生甚至初中生都应该理解起来没有什么问题,所以大家用这本书来学编程绝对是最佳选择了。)如果你不确定一个值是什么类型呢,你可以让解释器来告诉你:type(2)type(2)type(42.0)type(42.0)type(Hello,World!)type(Hello,World!)在这些例子中,class这个字样表明这是一类,一种类型就是对值的一种划分。很自然了,整形的就是int了,字符串就是str了,浮点数就是float了。那2和42.0这种是啥呢?他们看着像是数字,但带了单引号了。第一章编程之路11type(2)type(2)type(42.0)type(42.0)真相就是字符串了。咱们现在输入一个大的整数,在中间用逗号分隔试试看,比如1,000,000,并不是Python中合乎语法的整形,但也被接受了:1,000,0001,000,000(1,0,0)出乎意料吧,Python把逗号当做了分隔三个整形数字的分隔符了。我们以后再对这种序列进行讨论。1.6公式语言和自然语言自然语言就是人说的语言,比如英语、西班牙语、法语,当然包括中文了。他们往往都不是人主动去设计出来的(当然,人会试图去分析语言的规律),自然而然地发生演进。公式语言是人们为了特定用途设计出来的。比如数学的符号就是一种公式语言,特别适合表达数字和符号只见的关系。化学家也用元素符号和化学方程式来表示分子的化学结构。要注意的是:编程语言是一种用来表达运算的公式语言。公式语言有严格的语法规则和对语句结构的要求。比如数学式3+3=6是正确的,而3+=3¥6就不是了。化学上H2O是正确的化学式,而2Zz就不是。语法规则体现在两个方面,代号和结构。代号是语言的基础元素,比如单词、数字以及化学元素。3+=3$6这个式子数学上无意义的一个原因就是因为$并不是数学上的符号(至少我所学的数学是没有这个符号的)。类似地,2Zz也不对,因为没有一种化学元素的缩写是Zz.第二个语法规则是代号必须有严格的组合结构。3+=3这个式子数学上错误就因为虽然这些符号都是数学符号,但不能把加号等号放一起。类似地,化学方程式中要先写元素名字后写个数,而不是反着。Thisiswell-structuredEngli$hsentencewithinvalidt*kensinit.Thissentenceallvalidtokenshas,butinvalidstructurewith.第一章编程之路12这句英语的单词和结构都有错误,大家还是能看懂的哈。(译者注,作者故意这样写,来表明人类的自然语言容错率高。)你读一句英语或者公式语言中的语句时候,你必须搞清楚结构(虽然在自然语言中大家潜意识就能搞定了)。这就叫做解译。虽然公式语言和自然语言有很多共同特征,比如代号、结构、语法这些元素,但差别还是显著的,比如:二义性ambiguity:自然语言充满二义性,也就是歧义了,人们有时候用上下文线索或者其他信息来帮助处理这种情况。公式语言被设计为尽量不具有二义性,这就意味着一个语句往往只有唯一的一种含义,与上下文无关。冗余性redundancy:为了弥补歧义,减少误解,自然语言有很多冗余,结果就是经常有废话。公式语言要精简的多。文字修辞literalness:自然语言充满习语和隐喻等。比如我说“Thepennydropped”,可能并不是字面意思说硬币掉了(这个俚语意思是过了一会终于弄明白了)。公式语言的意思严格精准。咱们大家都是说着自然语言长大的,要调节到公式语言有时候挺难的。这两者之间的差别有点像诗词和散文,但差别更大:诗词Poetry:单词的运用要兼顾词义和押韵,诗的整体要有一定的意境或者情感上的共鸣。双关很常见,并且多是故意的。散文Prose:文字意思更重要,结构也有重要作用。相比诗词更好理解,但也有一定的双关语歧义。程序Programs:计算机程序的意义必须是无歧义和文采修饰的,能完全用代号和结构的方式进行解析。公式语言比自然语言要更加密集,读起来也需要更长时间。公式语言的结构也非常重要,所以从头到尾或者从左到右未必就是最佳方式。大家应该学着动脑来解译程序,分辨代号,解析结构。最后要注意的就是在公式语言中,细节特别特别重要。拼写和符号的小错误对于自然语言来说没什么,但对公式语言来说就能带来大问题。1.7调试第一章编程之路13程序员也会犯错的。由于很奇妙的原因,程序的错误被叫做bug,调试的过程就叫debug了。(译者注:一个传言是最早的计算机中经常有虫子进去导致短路之类的,清理虫子就成了常规调试的操作,流传至今。)编程,尤其是调试的过程,有时候会给人带来强烈的挫败感。面对特别复杂的状况,你可能就感到愤怒、压抑,或者特别难受。别担心,这些都是正常人对计算机的正常反应。计算机工作正常了,我们会觉得他们像是队友一样;一旦工作出错了,对我们很粗暴,我们对他们的反应就像是对待粗暴可恨的人一样(参考Reeves和Nass,TheMediaEquation:HowPeopleTreatComputers,Television,andNewMediaLikeRealPeopleandPlaces)。为这些反应做好心理准备,这样你在遇到类似情况就更好应对了。我们也可以把计算机当做一个有一定优点但也有特定缺陷的员工,比如速度快精度高,但缺乏共鸣和应对大场面的能力。你的工作就是做个好的经理人:尽量充分利用员工优势并降低他们缺陷的作用。然后想办法把你的情绪用在解决问题上,而不要让过激的反应干扰工作效率。调试的过程挺烦人的,但这个本领很有价值,而且在编程之外的其他领域都有用武之地。在每一章的末尾,都会有这样的一段,我会给出一些关于调试方面的建议。希望能帮到大家!1.8Glossary术语列表problemsolving:Theprocessofformulatingaproblem,findingasolution,andexpressingit.问题解决:将问题方程化,找到解决方案,并表达出来的过程。high-levellanguage:AprogramminglanguagelikePythonthatisdesignedtobeeasyforhumanstoreadandwrite.高级语言:例如Python这样的编程语言,设计初衷为易于被人阅读和书写。low-levellanguage:Aprogramminglanguagethatisdesignedtobeeasyforacomputertorun;alsocalled“machinelanguage”or“assemblylanguage”.低级语言:设计初衷为易于被计算机运行的语言,比如机器语言和汇编语言。portability:Apropertyofaprogramthatcanrunonmorethanonekindofcomputer.可移植性:程序能运行于多种平台的特性。interpreter:Aprogramthatreadsanotherprogramandexecutesit解释器:一边读取一边执行代码的程序。第一章编程之路14prompt:Charactersdisplayedbytheinterpretertoindicatethatitisreadytotakeinputfromtheuser.提示符:解释器显示的,提醒用户准备就绪,随时可以输入。program:Asetofinstructionsthatspecifiesacomputation.程序:进行一种特定运算的一系列指令。printstatement:AninstructionthatcausesthePythoninterpretertodisplayavalueonthescreen.打印语句:让Python解释器输出值到屏幕的指令。operator:Aspecialsymbolthatrepresentsasimplecomputationlikeaddition,multiplication,orstringconcatenation.运算符(操作符):一系列特殊的符号,表示一些简单的运算,比如加减乘除或者字符串操作。value:Oneofthebasicunitsofdata,likeanumberorstring,thataprogrammanipulates.值:数据的基本组成单元,比如数字或者字符串,是程序处理的对象。type:Acategoryofvalues.Thetypeswehaveseensofarareintegers(typeint),floating-pointnumbers(typefloat),andstrings(typestr).类型:对值的分类,大家刚刚接触到的有整形int,浮点数float,以及字符串str。integer:Atypethatrepresentswholenumbers.整形:就是整数咯。floating-point:Atypethatrepresentsnumberswithfractionalparts.浮点数:简单说,就是有小数点的数了。string:Atypethatrepresentssequencesofcharacters.字符串:一串有序的字符了。naturallanguage:Anyoneofthelanguagesthatpeoplespeakthatevolvednaturally.自然语言:人们说的语言,自然地演化。formallanguage:Anyoneofthelanguagesthatpeoplehavedesignedforspecificpurposes,suchasrepresentingmathematicalideasorcomputerprograms;allprogramminglanguagesareformallanguages.公式语言:人为设计的用于特定用途的语言,比如数学用途或者计算机编程用的;所有编程语言都是公式语言。第一章编程之路15token:Oneofthebasicelementsofthesyntacticstructureofaprogram,analogoustoawordinanaturallanguage.代号:程序结构中的一种基本元素,相当于自然语言中的单词。syntax:Therulesthatgovernthestructureofaprogram.语法:程序语言结构的规则。parse:Toexamineaprogramandanalyzethesyntacticstructure.解译:理解程序并分析语法结构的过程。bug:Anerrorinaprogram.Bug:程序的错误。debugging:Theprocessoffindingandcorrectingbugs.调试(debug):搜索和改正程序错误的过程。1.9练习练习1你读这本书的同时最好手边有台电脑,这样你就能把样例在电脑上随时运行来看看效果了。无论你学任何一种新功能的时候,都可以试着犯点错误。比如就在这个Hello,World!程序,你可以试试去掉一个引号会怎么样,都去掉会怎么样,print这个单词拼错了会怎么样等等。这种尝试能让你对读到的内容有更深刻的记忆;也有助于你编程,因为你在编程的时候也得知道调试信息的意思。所以最好现在就故意犯些错误来看看,比以后毫无准备地遇到要好多了。1.在print语句后面的括号去掉一个或者两个,看看会怎么样?2.Print字符串的时候如果你丢掉一个引号或者两个引号试试看会如何?3.输入一个负数试试,比如-2。然后再试试在数字前面添加加号会怎么样?比如2+2。4.数学上计数用零开头是可以得,比如02,在Python下面试试会怎样?5.两个值中间没有运算符会怎么样?第一章编程之路16第二章变量,表达式,语句编程语言最强大的功能就是操作变量。变量就是一个有值的代号。2.1赋值语句赋值语句的作用是创建一个新的变量,并且赋值给这个变量:message=Andnowforsomethingcompletelydifferentn=17pi=3.141592653589793上面就是三个赋值语句的例子。第一个是把一个字符串复制给名叫message的新变量;第二个将n赋值为整数17;第三个把圆周率的一个近似值赋给了pi这个变量。平常大家在纸上对变量赋值的方法就是写下名字,然后一个箭头指向它的值。这种图解叫做状态图,因为它能指明各个变量存储的是什么内容。下图就展示了上面例子中赋值语句的结果。Figure2.1:Statediagram.2.2变量名称编程的人总得给变量起个有一定意义的名字才能记得住,一般情况就用名字来表示这个变量的用途了。变量名称你随便起多长都可以的。包含字母或者数字都行,但是不能用数字来开头。大写字母也能用,不过还是建议都用小写字母来给变量命名,这个比较传统哈。变量名里面可以有下划线_,一般在多个单词组成的变量名里面往往用到下划线,比如your_name等等。你要是给变量起名不合规则,就会出现语法错误提示了:第二章变量,表达式,语句1776trombones=bigparadeSyntaxError:invalidsyntaxmore=1000000SyntaxError:invalidsyntaxclass=AdvancedTheoreticalZymurgySyntaxError:invalidsyntax第一个数字开头所以不合规则,第二个有非法字符,第三个这个class咋不行呢?好奇吧?因为classs是Python里面的一个关键词啦。解释器要用关键词来识别程序的结构,这些关键词是不能用来做变量名的。以下是Python3的关键词哈:FalseclassfinallyisreturnNonecontinueforlambdatryTruedeffromnonlocalwhileanddelglobalnotwithaselififoryieldassertelseimportpassbreakexceptinraise你不用去记忆这些哈。因为一般大多数的开发环境里面,关键词都会有区别于普通代码的颜色提示你,你要是用他们做变量名了,一看就会知道的。2.3表达式和语句表达式是数值,变量和操作符的组合。单个值本身也被当作一个表达式,变量也是如此,下面这些例子都是一些正确表达式:4242n17n+2542当你在提示符后面敲出一个表达式,解释器就判断一下,他会找到这个表达式的值。在本节的例子中,n的值是17,所以n+25就是42了。语句是一组具有某些效果的代码,比如创建变量,或者显示值。第二章变量,表达式,语句18n=17print(n)上面第一个就是赋值语句,给n赋值。第二行是显示n的值。输入语句的时候,解释器会执行它,就是会按照语句所说的去做。一般语句是没有值的。2.4脚本模式以上我们一直在用Python的交互模式,就是直接咱们人跟解释器来交互。开始学的时候这样挺好的,但如果你要想一次运行多行代码,这样就很不方便了。所以就有另一种选择了,把代码保存成脚本,然后用脚本模式让解释器来运行这些脚本。通常Python脚本文件的扩展名是.py。如果你知道怎么创建和运行脚本,那就尽管在自己电脑上尝试好了。否则我就建议你还是用PythonAnywhere。关于脚本模式的介绍我放到网上了,打开这个链接去看下哈。Python两种模式都支持,所以你可以先用交互模式做点测试,然后再写成脚本。但是两种模式之间有些区别的,所以可能也挺麻烦。举个例子哈,比如咱们把Python当计算器用,你输入以下内容:miles=26.2miles*1.6142.182第一行给miles这个变量赋初值(译者注:26.2英里是马拉松比赛全程长度),但是看着没啥效果。第二行是一个表达式,解释器会计算这个表达式,然后把结果输出。结果就是把马拉松全程长度从英里换算成公里,答案是42公里哈。不过你要是直接把这些代码存成脚本然后运行,是啥都看不到的,没有输出。在脚本模式表达式是没有明显效果的。Python确实会计算这些表达式,但不显示结果,想看到结果你就得告诉他输出一下:miles=26.2print(miles*1.61)这种情况开始还挺让人混乱的。脚本一般都是包含了一系列的语句。如果语句超过一条,每个语句执行的时候都会显示结果。比如下面这个:第二章变量,表达式,语句19print(1)x=2print(x)producestheoutput输出的结果如下12赋值语句是不会有任何输出的。检查下你理解了没哈,把下面这些语句输入到Python解释器,看看会发生什么:5x=5x+1现在再把同样的语句输入到脚本中,然后用Python来运行一下。看看输出是啥样的?把脚本中的表达式修改一下,每一个都加一个打印语句再试试。2.5运算符优先级表达式可能会包含不止一个运算符,这些不同的运算先后次序就是运算符的优先级。对于数学运算符来说,Python就遵循着数学上的规则。下面这个PEMDAS、是用来记忆这些优先规则的好方法:括号内的内容最优先,大家可以用括号来强制某系表达式有限计算。所以2*(3-1)就等于4了,(1+1)*(5-2)就是2的立方,等于8。使用括号也有助于让你的表达式读起来更好理解,比如(minute*100)/60,这个也不影响计算结果,不过看起来易于理解。除了括号,所有运算符中,乘方最优先,所以1+2*3的结果是9而不是27,2*3*2结果是18,而不是36。乘除运算比加减优先,译者认为大家都知道了,这个我就不细说了。同类运算符从左往右来进行,乘方除外。这个也不细说了,很简单。我不会花很大力气来记忆这些运算符的优先级。如果我怕记不住弄错了,就用括号来让优先级明确一下就好。2.6字符串操作第二章变量,表达式,语句20一般情况下,咱们不能对字符串进行数学运算的,即使字符串看上去像是数字也不行,所以以下这些都是非法操作:2-1eggs/easythird*acharm不过+和*可以用在字符串上面。+加号的意思就是字符串拼接了,会把两个字符串拼到一起,如下所示:first=throatsecond=warblerfirst+secondthroatwarbler星号也就是乘法运算符也可以用在字符串上面,效果就是重复。比如Spam*3结果就是SpamSpamSpam,重复了三次。需要注意的是字符串必须用整数去乘。这种加法和乘法实际上就是拼接和重复的意思。2.7注释程序会越来越庞大,也越复杂了,读起来就会更难了。公式语言很密集,靠阅读来理解代码,总是很困难的。为了解决阅读的困难,咱们就可以添加一些笔记到代码中,把程序的功能用自然语言来解释一下。这种笔记就叫注释了,使用井号#来开头的:#computethepercentageofthehourthathaselapsedpercentage=(minute*100)/60注释可以另起一行,也可以放到行末尾:percentage=(minute*100)/60#percentageofanhour井号#后面的内容都会被忽略,因此不会影响程序的运行结果。一般注释都是用来解释代码的一些不明显的特性。一般情况下读代码的人应该能理解代码的功能是什么,所以用注释多是要解释这样做的目的是什么。下面这个注释就显然是多余的,根本没必要:第二章变量,表达式,语句21v=5#assign5tov下面这种注释包含了重要信息,就很重要了:v=5#velocityinmeters/second.变量命名得当的话,就没必要用太多注释了,不过名字要是太长了,表达式读起来也挺麻烦,所以就得权衡着来了。2.8调试程序一般会有三种错误:语法错误,运行错误和语义错误。区分这三种错误有助于更快速地追踪错误。语法错误Syntaxerror:语法是指程序的结构和规则。比如括号要成对用。如果你的程序有某个地方出现了语法错误,Python会显示出错信息并退出,程序就不能运行了。最开始学习编程的这段时间,你遇到的最常见的估计就是这种情况。等你经验多了,基本就犯的少了,而且也很容易发现了。运行错误Runtimeerror:第二种错误就是运行错误,显而易见了,就是直到运行的时候才会出现的错误。这种错误也被叫做异常,因为一般表示一些意外的尤其是比较糟糕的情况发生了。语义错误Semanticerror:第三种就是语义错误,顾名思义,是跟意义相关。这种错误是指你的程序运行没问题,也不产生错误信息,但不能正确工作。程序可能做一些和设计目的不同的事情。发现语义错误特别不容易,需要你仔细回顾代码和程序输出,要搞清楚到底程序做了什么。2.9Glossary术语列表variable:Anamethatreferstoavalue.变量:有值的量。assignment:Astatementthatassignsavaluetoavariable.赋值:给一个变量赋予值。statediagram:Agraphicalrepresentationofasetofvariablesandthevaluestheyreferto.第二章变量,表达式,语句22状态图:图形化表征每个变量的值。keyword:Areservedwordthatisusedtoparseaprogram;youcannotusekeywordslikeif,def,andwhileasvariablenames.关键词:系统保留的用于解析程序的词,不能用关键词当做变量名。operand:Oneofthevaluesonwhichanoperatoroperates.运算数:运算符来进行运算操作的数值。expression:Acombinationofvaria
展开阅读全文