书名:Python 快速入门(第3版)
ISBN:978-7-115-50935-2
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [美] 娜奥米•塞德(Naomi Ceder)
译 戴 旭
责任编辑 杨海玲
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Original English language edition, entitled The Quick Python Book, Third Edition by Naomi Ceder published by Manning Publications Co., 209 Bruce Park Avenue, Greenwich, CT 06830. Copyright © 2018 by Manning Publications Co. Simplified Chinese-language edition copyright © 2019 by Posts & Telecom Press. All rights reserved.
本书中文简体字版由Manning Publications Co.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。 版权所有,侵权必究。
这是一本Python快速入门书,基于Python 3.6编写。本书分为4部分,第一部分讲解Python的基础知识,对Python进行概要的介绍;第二部分介绍Python编程的重点,涉及列表、元组、集合、字符串、字典、流程控制、函数、模块和作用域、文件系统、异常等内容;第三部分阐释Python的高级特性,涉及类和面向对象、正则表达式、数据类型即对象、包、Python库等内容;第四部分关注数据处理,涉及数据文件的处理、网络数据、数据的保存和数据探索,最后给出了相关的案例。
本书框架结构清晰,内容编排合理,讲解循序渐进,并结合大量示例和习题,让读者可以快速学习和掌握Python,既适合Python初学者学习,也适合作为专业程序员的简明Python参考书。
学习Python基础知识的最快途径。
——Massimo Perga,微软公司
这是我中意的Python书籍……足以带我踏上Python编程之路。
——Edmon Begoli,美国橡树岭国家实验室
好书……涵盖了Python的新特性。
———William Kahn-Greene,网络共享文化基金会
正如Python本身一样,本书重点关注的是清晰易读和快速开发。
——David McWhirter,Cranberryink
本书绝对值得一读,推荐Python新人购买。
——Jerome Lanig,湾区Python兴趣小组用户组
Python编程人员都会爱上这本好书。
——Sumit Pal,Leapfrogrx
如果你想学Python,或者想要一本简明的案头参考书,本书正好合适。作者先对Python语言的语法和功能做了概述,然后再对所有要点做了详细介绍,包括库和模块的使用,并由此将Python用于生产实践。
——Jim Kohli,Dzone
本书最适合专业程序员及熟悉其他编程语言的人学习Python……本书不会是你唯一的Python书,但应该是你的第一本Python书!
——亚马逊读者
我认识Naomi Ceder已有很多年了,我们一直是同事和朋友。她在Python社区里一直享有盛誉,她既是极具感召力的老师,又是专业程序员,还是了不起的社区组织者。对于她的至理名言,你一定会愿意洗耳恭听。
这可不是我的一家之言!作为一名导师,Naomi帮助过无数人学习Python语言。Python社区的很多成员,包括我本人在内,都曾受益于她的付出。她具有丰富的教学经验,这意味着,她很清楚对Python高手来说,这门语言学习的重点在哪里,而学生需要额外关注哪些地方。而这些智慧的结晶,已经巧妙地融入了本书的每一页当中。
Python以功能完备而著称,正所谓“功能齐备”(batteries included)。由Python的众多模块(module)组建起来的生态系统,已经涵盖了大量应用领域,能胜任很多工作。快来掌握这强大、易学、欣欣向荣的编程语言吧,现在正是激动人心的时刻。
本书是一本Python快速入门书,充分体现了Naomi的简约教学风格,确保你有一本随手可翻的Python提要,而且这些重点内容都是Python编程的坚实基础。更为重要的是,本书能让你获得对Python足够的理解和背景知识,以便自主而高效地动手实践。有了本书,在成长为Python开发人员的道路上,你将知道该做什么、去哪里寻找答案、遇到困难时该问什么问题。
Naomi的书正是体现Python风格的典范:优美胜于丑陋,简单胜于复杂,注重可读性。
你已手握一本精彩的Python入门指南。祝一路顺利、旅途愉快!
Nicholas Tollervey
Python软件基金会(PSF)成员
我用Python编程已经有16年了,远远超过了我用其他任何语言的时间。这16年来,我先后用Python完成了系统管理、Web应用、数据库管理、数据分析等多种工作。但最重要的是,我已经开始用Python帮助自己更加清晰地思考问题。
如果按我早先的经验,我一定会认为自己现在应该被其他更快、更酷、更性感的编程语言所吸引。之所以没有如此有两点原因。第一,虽然有很多其他编程语言出现,但它们都不能像Python那样满足我对开发效率的要求。这么多年过去了,对Python用得越多,我对它的理解就越深,也愈发觉得自己的编程质量越来越高,越来越成熟。
第二个原因就是Python社区。这是我见过的最受欢迎、最包容、最活跃和最友善的社区之一, 成员囊括了来自各大洲的科学家、金融分析师、Web开发人员、系统开发人员和数据科学家。与这个社区的成员一起工作总是那么快乐和荣幸,我鼓励所有人都能加入进来。
本书的写作花了不少时间。我们虽然还是在用Python 3,但Python 3的近期版本已经比3.1版大大进步了,并且人们使用Python的方式也发生了变化。尽管我始终致力于将前一版书的优质内容保留下来,但我还是希望这个版本既实用又能与时俱进,因此对相当多的内容都做了增减和重排。我尽量保持清晰低调的风格,而且避免乏味。
对我而言,本书的目标是要把大家引入Python 3的大门,把我的Python编程经验分享给你们。在我看来,Python 3是迄今为止最伟大的Python版本。愿你的学习之旅一切如意,如我。
我要感谢LaunchBooks的David Fugate,起初正是他引导我撰写本书的,也是他多年来一直给我支持和建议。我想再也找不到更好的经纪人和朋友了。我还要感谢Manning出版社的Michael Stephens,是他提出了出版本书第3版的想法,也是他支持我尽全力让第3版能达到前两版的水平。我还要感谢Manning出版社中为本项目工作的每一个人,特别要感谢Marjan Bace的支持,感谢Christina Taylor在内容开发阶段的指导,感谢Janet Vail帮助我让本书顺利投产,感谢Kathy Simpson在编辑时的耐心,感谢Elizabeth Martin的校对。我还要衷心感谢众多的审稿人,他们的意见和反馈帮助甚大,包括本书的技术校对André Filipe de Assunção e Brito,还有Aaron Jensen、Al Norman、Brooks Isoldi、Carlos Fernández Manzano、Christos Paisios、Eros Pedrini、Felipe Esteban Vildoso Castillo、Giuliano Latini、Ian Stirk、Negmat Mullodzhanov、Rick Oller、Robert Trausmuth、Ruslan Vidert、ShobhaIyer和William E. Wheeler。
我还要感谢第1版的作者Daryl Harms和Kenneth MacDonald,他们的作品如此完美,一直在印刷,超过了绝大部分技术书籍的平均寿命。这也让我有机会改进第2版书,并写出了第3版。我还要感谢所有购买了第2版书并给出积极评论的读者。我希望第3版书能延续前两版的成功,继承第1版和第2版的不老传统。
我还要感谢Nicholas Tollervey的友情,他为本版书作了序,感谢多年来我们的友谊和他为Python社区做的贡献。我还要感谢整个Python社区多年来一直给我支持、智慧、友谊和欢乐。感谢你们,我的朋友。还要感谢我的忠诚助理Aeryn,和我写第2版时一样,她一直陪伴着我,并帮助我在撰写本书时保持清醒的头脑。
最重要的,一如既往地感谢Becky,她不仅鼓励我承担这个项目,而且全程支持着我。没有她,我真的完不成本书。
本书适用于已用过一种以上的编程语言并需要尽快掌握Python 3基础知识的读者。本书虽然也讲到了一些编程的基本概念,但并未对编程的基础技能进行讲授,并且假定读者已经掌握流程控制、OOP(面向对象编程)、文件访问、异常处理之类的基本概念。本书也可作为Python 3的简明参考书,供Python早期版本的用户使用。
第一部分简单介绍了Python,解释了在本机系统中下载、安装Python的方法,并对语言进行了概述。这十分有助于经验丰富的程序员站在较高的层面了解Python。
第二部分是本书的核心内容,涵盖了使用Python时必须掌握的知识点,这里将Python视为一门通用的编程语言。在章节设计时,考虑了让Python的初学者能够循序渐进地学习,掌握这门语言的关键知识点。在这几章中还包含了一部分比较高级的内容,大家可以回过头去复习一下有关概念或主题的所有必要信息。
第三部分介绍了Python语言的高级特性。这些特性并非一定用得到,但对专业Python程序员确实非常有帮助。
第四部分讲述了一些比较高级或专业的主题,已不仅仅是编程语言的语法介绍。大家可根据自身需要选择性阅读这部分章节。
如果你是Python的新手,建议从第3章开始阅读,以便对Python有一个整体的了解,然后再继续阅读第二部分的各章。在遇到交互式代码示例时,请在计算机上录入一下,以便迅速加深对相关概念的理解。除文中的示例之外,读者还可以进一步获得不清楚的习题的解答。这对加快学习速度、提高理解程度都会有所帮助。如果对OOP不熟悉或用不上,那么第15章的大部分内容都可以跳过。
即便是对Python比较熟悉的读者,也请从第3章开始阅读。这里对Python 3和其他版本的区别进行了很好的回顾和介绍。这也算是一次合理的测验,看看读者是否准备好开始学习第三和第四部分的进阶内容了。
有些读者虽然是Python新手,但可能对其他编程语言拥有足够丰富的经验。因此,这些读者只要读过第3章,大致浏览一下第19章列出的Python标准库模块清单,再看看Python官方文档中的《Python库参考手册》,就有可能弄明白大部分需要了解的内容。
第1章讨论Python的优缺点,展示为什么Python 3是一种不错的选择,是适用于很多场合的编程语言。
第2章介绍Python解释器和IDLE的下载、安装和启动过程。IDLE是Python自带的集成开发环境。
第3章是对Python语言的简要概述,对其设计理念、语法、语义和功能给出了基本的概念。
第4章开始介绍Python的基础知识,包括变量、表达式、字符串、数值等,还介绍了Python代码块的语法。
第5、6和7章介绍Python的5种强大的内置数据类型,即列表、元组、集合、字符串和 字典。
第8章介绍Python流程控制的语法和用法(循环和if-else
语句)。
第9章介绍Python函数的定义,及其灵活的参数传递能力。
第10章介绍Python的模块,这种机制可以方便地将程序的命名空间进行分段。
第11章介绍如何创建可独立运行的Python程序(脚本),并在Windows、macOS和Linux下运行。这一章还会介绍对命令行选项、参数和I/O重定向的支持。
第12章介绍如何处理并遍历文件系统中的文件和目录,还演示了如何编写尽可能独立于当前操作系统的代码。
第13章介绍Python中的文件读写机制,包括基本的字符串(或字节流)读写能力、可用于读取二进制记录的机制以及任意Python对象的读写能力。
第14章讨论异常(Python错误处理机制)的用法,这里假定读者对异常一无所知。当然,如果读者已经在C++或Java中用到过异常,就会发现它们比较类似。
第15章介绍Python对面向对象程序的支持。
第16章讨论Python可用的正则表达式功能。
第17章介绍较高级的OOP技术,包括Python类的特殊方法(属性)、元类和抽象基类。
第18章介绍Python包的概念,可用于组织大型项目的代码。
第19章是对标准库的简要介绍,还会对其他模块的获取途径、安装方法进行讨论。
第20章深入探讨Python中的文件操作。
第21章介绍对各种类型的数据文件进行读取、清洗和写入的方法。
第22章演示获取网络数据的过程、常见问题和工具。
第23章讨论Python访问关系数据库和NoSQL数据库的方式。
第24章简要介绍利用Python、Jupyter记事本和pandas对数据集进行探索的过程。
第25章案例研究部分将演示用Python进行数据获取、清洗并作图的过程。该项目综合了前几章提到的一些Python特性,读者将有机会看到一个项目从头至尾的完整开发过程。
附录A介绍Python文档的获取或访问方式,包括完整的官方文档、Python式风格指南、PEP 8和Python之禅。Python之禅(The Zen of Python)稍显牵强地总结了Python背后的设计哲学。
习题答案给出了大部分习题的答案(读者可以按“资源与支持”中的说明自行下载)。不过有些习题是要求读者亲自动手的,书中就没有给出答案了。
本书给出的示例代码及其输出结果,都是以等宽字体显示的,一般都带有注解。因为不是为直接在读者的代码中复用而准备的,所以对这些代码特意做了最大程度的简化。简化了代码,读者就能专注于正在介绍的主题。
为了保持代码简单,这些示例尽量以交互式shell会话的方式给出,请尽可能动手输入并体验一下这些代码。在交互式代码示例中,需要键入的命令都是以>>>提示符开始的,代码的运行结果(如果有的话)则在接下来的行中显示。
有时候需要用到较长的代码示例,这些示例在书中会标识为文件清单。读者应该把这些清单保存为文件,文件名应该与书中用到的文件名一致,然后就可以作为单独脚本运行了。
从第4章开始,本书将给出3种类型的习题。速测题是一些很简单的问题,建议读者花一些时间确认一下是否已掌握了相关的内容。动手题则要求更高一些,建议读者动手写一些Python代码。在很多章节的末尾还会有研究题,让读者有机会将这一章和前几章的概念结合起来,完成一段完整的脚本。
大部分习题都会在习题答案中给出答案,在本书所附源代码中也会有一个单独的目录存放答案。请记住,这些答案并非就是针对这些编码问题的唯一答案,还可能会有其他的答案。读者如果要判断自己的答案是否合理,最好的方式就是先去理解书中给出的答案,然后再来确定自己的答案是否达到了同样的目的。
本书的示例代码在编写时已经考虑了Windows(Windows 7到Windows 10)、macOS和Linux系统。因为Python是一种跨平台的编程语言,除一些与平台紧密相关的内容(如文件处理、路径、图形用户界面等)之外,这些示例代码多数应该能在其他平台上运行。
本书基于Python 3.6编写,所有的示例代码应该都能在Python 3的后续版本中正常运行。大部分代码已经在Python 3.7预发布版中测试通过了。除少数内容之外,这些示例代码也可以在Python 3.5中正常运行,但还是强烈建议使用3.6版本。使用低版本没有任何好处,3.6版本的Python有多处细微的改进。注意,本书的代码必须使用Python 3,版本过低就无法正常运行了。
本书的作者是Naomi Ceder,她的编程生涯已经持续了近30年,使用过多种编程语言。她做过Linux系统管理员、编程教师、开发人员和系统架构师。她从2001年开始使用Python,从此向各个层次的用户讲授Python,用户从12岁的孩子到专业编程人员都有。她向所有人宣传Python,宣讲加入内容丰富的社区的好处。Naomi现在领导着Dick Blick Art Materials的一支开发团队,并且是Python软件基金会(Python Software Foundation)的主席。
本书第3版的封面插画取自18世纪晚期法国出版的四卷地方服饰风俗汇编,作者是Sylvain Maréchal。其中的每张插图都画工精湛,且为手工上色。Maréchal作品中收集的服饰种类众多,生动地呈现了200年前多个城市和地区在文化上的差异。由于各地之间存在地理阻隔,人们的方言各不相同,不管是在城市还是乡村,只要通过穿着打扮就能轻易分辨出一个人的居住地、职业和身份地位。
之后服饰的风格发生了变化,当年丰富的地区多样性也逐渐消失殆尽。现在通过服饰连不同大洲的居民都很难区分出来了,更不用说不同城市和地区了。也许,我们是牺牲了文化的多元性,来换取个人生活的丰富多彩——更多选择、更快节奏的高科技生活。
Maréchal的插画将我们带回到两个世纪之前,领略到当时丰富的地区多样性。在计算机书“千书一面”的今天,Manning出版的图书借此作为封面,以为计算机行业的创新和进取精神点赞。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供源代码下载及习题答案。要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
前3章将对Python做出简要介绍,包括优缺点和学习Python 3时的注意事项。第2章中将会给出Python在Windows、macOS、Linux平台中的安装过程,并演示了一个简单的程序。第3章对Python的语法和特性做了快速的、较高层次的描述。 如果想要Python最快速的介绍,可以从第3章开始。
本章主要内容
如果想了解Python与其他编程语言的差异,以及它当前的地位,请阅读本章。如果想立即开始学习Python,请略过开头部分,直接跳到第3章。本章内容是本书不可或缺的组成部分,但对于Python编程确实不是必备知识。
现在有数百种编程语言可供使用,从成熟的C和C++到Ruby、C#和Lua等新秀,再到Java这样的企业级重器。要选择一门编程语言来学习确实很难。虽然没有一种语言能适合任何场景,但我觉得,对于大量的编程问题来说,Python都算得上是个好选择。如果正在学习编程,Python也是一个不错的选择。目前全球有数十万名程序员都在使用Python,并且用户数每年都在增长。
Python能够持续吸引新用户,是有很多理由的。Python是一款真正的跨平台编程语言,从Windows、Linux/UNIX到Macintosh平台,从超级计算机到手机,它都能很好地运行。Python可以用于开发小型应用程序和快速原型系统,但也能扩展到足以开发大型程序。Python自带了功能强大且易于使用的图形用户界面(GUI)工具包、Web编程库等。而且更重要的是,Python完全免费。
Python是Guido van Rossum在20世纪90年代研发的一种现代编程语言(以一个著名的喜剧团体命名)。尽管Python并不能完美地适用于所有应用程序的开发,但它的优势使其成为许多情况下的理想选择。
熟悉传统语言的程序员会发现,Python很容易学习。包含了所有熟悉的结构,如循环、条件语句、数组等,但在Python中很多都更易于使用。原因有以下几点。
Python非常适合应用程序的快速开发。用Python编写应用程序的时间可能只有用C或Java的五分之一,并且代码行数只有等效C程序的五分之一,这种情况并不少见。当然,这要视具体的应用场景而定。对于那种大部分是在for
循环中执行整数运算的数值算法,Python提升的生产力会少得多。对于普通的应用来说,生产力收益可能会比较可观。
Python是一种极具表现力的编程语言。这里的“表现力”是指:同样是一行代码,Python可以完成的操作比其他大多数语言都要多。表现力较强的语言,优势十分明显,需要编写的代码越少,项目完成的速度就越快。代码越少,程序就越容易维护和调试。
为了体会一下Python的表现力是如何简化代码的,请考虑交换两个变量var1
和var2
的值。在类似Java的语言中,这需要3行代码和1个额外的变量:
int temp = var1;
var1 = var2;
var2 = temp;
在将var2
的值赋给var1
时,需要先用变量temp
暂存var1
的值,然后再把该暂存值赋给var2
。这个过程并不是很复杂,但是阅读这3行代码并理解这是为了完成数值交换,是要花些工夫的,即便是有经验的程序员也一样。
相比之下,Python允许在一行代码中完成相同的交换操作,并且从交换方式就能明显看出交换确实发生了:
var2, var1 = var1, var2
当然这只是一个很简单的例子,但类似的优点在Python中俯仰皆是。
Python的另一个优点是可读性好。也许读者会认为,编程语言只要能被计算机读懂就可以了,但其实人类同样得能读懂。要阅读代码的人,可能是调试人员(很可能就是写程序的人),可能是维护人员(仍然可能是写程序的人),也可能是任何将来修改代码的人。凡此种种,总之代码越容易阅读和理解越好。
代码越容易理解,就越易于调试、维护和修改。Python在这方面的主要优势就是利用缩进。与大多数语言不同,Python坚持要求代码块必须整体缩进。尽管这会让有些人感到奇怪,但好处就是代码总是能以一种非常易懂的风格进行格式化。
以下是两小段程序,一个用Perl编写,另一个用Python编写。两者的操作相同,参数都是两个相同大小的数值列表,返回对其两两求和后的列表。我认为Python代码的可读性比Perl代码更好,看起来更干净,难以理解的符号更少:
# Perl版
sub pairwise_sum {
my($arg1, $arg2) = @_;
my @result;
for(0..$#$arg1) {
push(@result, $arg1->[$_] + $arg2->[$_]);
}
return(\@result);
}
# Python版
def pairwise_sum(list1, list2):
result = []
for i in range(len(list1)):
result.append(list1[i] + list2[i])
return result
上面两段代码完成的工作相同,但Python代码胜在了可读性上。当然,Perl还能有其他的实现方式,其中有一些确实会比以上代码简洁得多,但我认为也更加晦涩难懂。
Python的另一个优势是“功能齐备”(batteries included)理念,因其自带了很多函数库。基本思路就是,安装Python后就应该万事俱备,不需要再安装其他库就能真正开始工作了。这就是为什么Python的标准库自带了电子邮件、网页、数据库、操作系统调用、GUI开发等处理模块。
例如,只需要写两行代码,就可以用Python编写一个Web服务器,用于共享某个目录中的文件。
import http.server
http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler)
无须再安装用于网络连接和HTTP的库,Python都已内置好了,开箱即用。
Python还是一种优秀的跨平台语言,可以在很多平台上运行,包括Windows、Mac、Linux、UNIX等。因为它是解释型语言,相同代码可以在任何装有Python解释器的平台上运行,而目前几乎所有平台都具备了Python的解释器。Python甚至还有在Java(Jython)和.NET(IronPython)中运行的版本,为运行Python提供了更多可能的平台。
Python还是免费的。自始至终,Python就是以开源的方式研发的,并且可以免费获取。任一版本的Python都可自行下载和安装,并可用于开发商业或个人应用,分文不收。
虽然世人的态度在慢慢转变,但由于担心缺乏技术支持,担心缺少付费客户的影响力,有些人仍然对免费软件持怀疑态度。但是Python已经被许多大牌公司用于实现关键业务,谷歌、Rackspace、Industrial Light&Magic和Honeywell只是其中的几个例子。这些公司和许多其他公司都很清楚,Python是一个非常稳定、可靠且支持良好的产品,拥有一个活跃的、博识的用户社区。即便提出高难度的Python问题,也能在Python互联网新闻组中迅速获得答案,速度会比大多数技术支持电话快得多,而且无须付费、保证正确。
Python和开源软件
不仅Python是免费的,它的源代码也可以免费使用,可随意进行修改、完善和扩展。因为源代码是免费提供的,所以可供所有人查看并修改。其他那些带有版权的软件,鲜有能以合理的费用进行这种修改的。
如果是第一次接触开源软件,大家应该要了解,不仅可以自由使用和修改Python,还能够(也鼓励)为其做出贡献并对其进行改进。根据自身的条件、兴趣和技能,可以给出财务上的贡献,例如捐赠给Python软件基金会(Python Software Foundation,PSF)。也可以参加特殊兴趣小组(Special Interest Group,SIG),对Python内核或某个辅助模块的发行版进行测试并给出反馈。还可以向社区贡献一些自己或公司开发的东西。当然贡献的大小完全是自行决定的,但只要有能力就一定要考虑去做点什么。这里正在创造巨大的价值,有机会就来添砖加瓦吧。
Python满足了很多期许,表现力强大、可读性好、内置库丰富、跨平台,而且还是开源的。难道真的就完美无缺了吗?
虽然Python拥有很多优点,但没有哪种编程语言能够胜任所有工作,因此Python并不能完美地满足一切需求。如果要确定Python是否适用于当前场景,还需要了解Python不擅长的领域。
Python的执行速度可能算得上是一个缺点。Python不是一个完全编译的语言,而是先编译为内部字节码形式,然后交由Python解释器来执行。Python为某些操作给出了高效的实现,例如,用正则表达式解析字符串,可以做到与自己编写的任何C语言代码一样快,甚至会更快。但在大多数情况下,采用Python会比C之类的语言实现更慢。但大家应该保持以下观点:对绝大多数应用程序而言,现代计算机的计算能力都是过剩的。开发速度比程序运行速度更为重要,而Python程序通常编写速度会快很多。另外,用C或C ++编写的模块对Python进行扩展也比较容易,程序当中的CPU密集型部分可以交由这些模块来运行。
虽然Python自带了一批优秀的函数库集合,而且还有很多其他库可用,但是Python在库的数量上并不算领先。像C、Java和Perl之类的编程语言,可用的库集合数量更为庞大。它们在某些领域提供的解决方案是Python所没有的,或者Python可能只提供了其中的一种可选方案。不过这些往往是相当专业的领域,而Python是很容易扩展的,既可以用Python,也可以用C或其他语言的现有库。对于几乎所有的常规计算问题,Python库的支持能力都非常出色。
与某些其他编程语言不同,Python变量不像容器那样工作,而更像是引用整数、字符串、类实例等各类对象的标签。这表示这些对象本身虽然是有类型的,但引用它们的变量并没有与类型进行绑定。变量x
可能在某一行代码中引用一个字符串,而在另一行代码中引用一个整数:
>>> x = "2"
>>> x
'2' ⇽--- x为字符串"2"
>>> x = int(x)
>>> x
2 ⇽--- 现在x为整数值2
Python将类型与对象关联,而不是与变量关联,这就意味着Python解释器无法识别出变量类型不符的错误。假设变量count
本来是用来保存整数的,但如果将字符串"two"
赋给它,在Python里也完全没问题。传统的程序员将这种处理方式算作一个缺点,因为对代码失去了额外的免费检查。但是这种错误通常不难发现和修复,Python的代码检测功能可以避免类型错误的发生。大多数Python程序员都认为,动态类型的灵活性是划得来的。
在过去的10年中,移动设备的数量和种类都出现了爆炸式的增长,到处都是智能手机、平板电脑、平板手机、Chromebook,运行的操作系统也是五花八门。Python在移动计算领域并不算强大。虽然有解决方案可选,但在移动设备上运行Python并不总是能一帆风顺,用Python编写和发布商业应用还存在问题。
现在多核处理器已经普及,在很多情况下也都会带来性能的明显提升。但是,由于具有名为全局解释器锁(global interpreter lock,GIL)的特性,Python的标准版本并没有按照多内核来进行设计。详情请查看David Beazley、Larry Hastings等人关于GIL的讨论视频,或者访问Python wiki里的GIL页面。尽管用Python可以运行并发进程,但如果需要“开箱即用”的并发能力,Python可能并不合适。
Python很多年前就已经出现了,并且还在不断发展。本书第1版基于Python 1.5.2,Python 2.x作为主流版本已经持续了很多年。本书是基于Python 3.6的,并在Python 3.7的Alpha版中通过了测试。
Python 3最初被异想天开地命名为Python 3000,因为它是Python历史上第一个打破向下兼容的版本。这就意味着,如果不做任何修改,在低版本Python中编写的代码可能无法在Python 3下运行。例如,在低版本的Python中,print
语句不需要在参数外面加上括号:
print "hello"
在Python 3中,print
成了一个函数,需要加上括号:
print("hello")
也许有人会想:既然会破坏以前的代码,为什么还要修改这种细节呢?正因为对任何语言而言这种改动都是件大事,所以Python的核心开发人员仔细考虑过这个问题。尽管Python 3中的变化会破坏与旧代码的兼容性,但这些变化很小,好处却很多。新版本Python的一致性更好,更具可读性,歧义也更少了。Python 3并不是翻天巨变,而是深思熟虑之后的演进。核心开发人员也贴心地提供了代码迁移方案和工具,可以安全高效地将以前的旧代码迁移到Python 3中,后续章节中将会介绍。此外还可以利用Six和Future库来简化代码转换操作。
为什么要学Python 3呢?因为它是迄今为止最好的Python版本。随着很多项目开始充分利用Python 3的改进之处,它将成为未来几年的主流Python版本。自从Python 3推出之后,库的移植工作一直在稳步进行。到目前为止,很多受欢迎的库都已支持Python 3了。事实上,根据Python就绪页面所示(http://py3readiness.org),360个最流行的库中已有359个被移植到Python 3中了。如果确实需要使用未被转换过的库,或者要使用基于Python 2建立的代码,那就继续使用Python 2.x吧。但如果是刚开始学习Python或新建项目,就使用Python 3吧。Python 3不仅更好用,而且是大势所趋。
本章主要内容
本章将介绍Python和IDLE的下载、安装和启动过程,IDLE是Python的一种集成开发环境。在撰写本书时,Python的最新版本是3.6,3.7版尚在开发中。经过多年的改进,Python 3是第一个无法与低版本完全兼容的版本,所以请确认手头一定是Python 3。如此重大的调整,下一次出现应该要再过很多年了,而且以后的任何改进都会再三考虑,避免对已有重要代码库产生影响。因此,本章给出的内容不太可能会很快过时。
无论用的是哪个平台,安装Python都是一件简单的事情。第一步是根据机器环境获取最新的发行版本,在Python官方网站上一定可以找到。本书基于Python 3.6。如果已经安装了Python 3.5甚至Python 3.7,那就万事大吉了。其实只要是Python 3的任何版本都可以,本书的大部分内容应该都没有什么问题。
多个版本共存
机器上有可能已经安装了低版本的Python。很多Linux发行版和macOS都自带了Python 2.x,Python已成为了这些版本操作系统的一部分。因为Python 3无法完全兼容Python 2,所以有必要弄清楚在同一台计算机上安装两个版本是否会引起冲突。
不必担心,可以在同一台计算机上安装多个版本的Python。在基于UNIX的系统中(如OS X和Linux),Python 3会与低版本并列安装,不会替换掉低版本的文件。系统在查找python
命令时,仍会准确找到低版本。如果要访问Python 3,可以运行python3
或者idle
命令。在Windows系统中,不同的版本安装在不同的位置,并拥有相互独立的菜单项。
下面列出了一些安装Python时的特定平台说明。平台不同,情况可能会稍有差别,因此请务必阅读下载页面中有关各版本的说明。读者可能已经十分熟悉在自己机器上安装软件的过程,那就长话短说。
brew install python3
安装Python。在Python主页上有相关链接,可以找到关于在OS X上使用Python的更多信息。Anaconda是Python的另一个发行版本
除可以直接从Python.org获得Python的发行版本之外,名为Anaconda的发行版也越来越受欢迎,特别是在科学计算和数据科学用户当中。Anaconda是一个以Python为内核的开放式数据科学平台。安装Anaconda之后,不仅Python已就绪,还拥有了R语言和大量预装的数据科学软件包,还可以用附带的conda软件包管理器添加很多其他内容。当然也可以安装miniconda,它只包含Python和conda,然后按需添加软件包。
Anaconda或miniconda都可以从Anaconda官网获取。下载与当前操作系统匹配的Python 3安装程序,并按照操作说明运行。安装完成后,机器上就拥有了完整的Python版本。
如果读者主要对数据科学领域感兴趣,可能就会发现,Anaconda能以一种更快、更简单的方式启动并运行Python。
Python内置两种与解释器的交互模式:原始的基础(命令行)模式和IDLE。IDLE在很多平台(包括Windows、Mac和Linux)上都有提供,但在其他平台上可能就没有了。为了能让IDLE运行起来,可能需要多做几步操作并安装额外的软件包。但这些多做的工作是值得的,因为IDLE提供了比基础的交互模式更流畅的用户体验。不过,即便平常是用IDLE的,可能还是需要时常启用一下基础模式。对这两种模式的启动和使用,都应该足够熟悉才行。
基础交互模式是一个相当原生的环境,但本书中的交互式例程一般都比较小。在本书的后续部分,会介绍如何方便地将文件中的代码加入会话(通过模块机制)。下面是在Windows、macOS和UNIX中启动基础会话的步骤。
python3
。如果出现“Command not found”错误,请运行Applications目录下Python3子目录中的Update Shell Profile
脚本。python3
。在当前窗口中会出现版本消息,类似于图2-1所示,后面跟着Python提示符>>>
。图2-1 Windows 10中的基础交互模式
退出交互式shell
按下Ctrl+Z(Windows中)或Ctrl+D(Linux或UNIX中),或者在命令提示符下键入exit()
,即可退出基础会话。
大部分系统都带有命令行编辑和命令历史记录机制。用上下箭头键和Home、End、Page Up、Page Down键可以翻看之前输入的命令,按下Enter键即可再次执行。在用本书学习Python时,这种方式足够用了。另一种方案是使用优秀的Python模式下的Emacs编辑器,通过集成的shell缓冲区来访问Python的交互模式。
IDLE是Python内置的开发环境,其名称为“Integrated DeveLopment Environment”的缩写(当然,也可能受了某个英国电视节目演员姓氏的影响)。IDLE集成了交互式解释器、代码编辑和调试工具,与创建Python代码有关的工作可以在此一站式完成。IDLE提供的多种工具,足以吸引大家从它这里开始学习Python。以下是在Windows、macOS和Linux中运行IDLE的方法。
idle3
,将会出现一个类似图2-2的窗口。如果使用操作系统的包管理器来安装IDLE,那么在Programming之类的子菜单中应该会有一个IDLE的菜单项。图2-2 WIndows中的IDLE
用IDLE还是用基础shell窗口呢?请先从IDLE或Python shell窗口开始。在第10章以前,这两种界面都能胜任本书的代码示例。第10章将会介绍如何编写自己的模块,用IDLE创建和编辑代码文件会比较便捷一些。但如果有特别偏爱的文本编辑器,也许再加上基础shell窗口就能满足需要了。如果没有特别偏爱的编辑器,建议就从IDLE开始吧。
启动IDLE后会打开Python shell窗口(如图2-3所示)。当键入代码时,它会基于Python语法提供自动缩进和代码着色功能。
图2-3 使用IDLE中的Python shell。代码在输入时会自动着色(基于Python语法)。将光标放在任一已键入的命令上并按下Enter键,就会把命令和光标一起移动到最后一行,在这里可以编辑命令,按Enter键就会将这条命令发送给解释器。将光标放在最后一行,按下Alt+P或Alt+N键,就可以在历史记录中前后切换命令。找到要执行的命令后,根据需要进行编辑并按下Enter键,就会将其发送给解释器
利用鼠标、箭头键、Page Up和Page Down键,以及某些符合Emacs标准的键,可以在命令缓冲区中来回移动。详情参见Help菜单。
会话中的所有内容都会被记入缓冲区中。可以前后滚动或搜索,将光标放在任意行上按下Enter键(生成一个硬回车),该行就会被复制到屏幕的最后一行,在这里可以编辑命令,再次按下Enter键就会将其发送给解释器。也可以让光标停在最后一行,然后通过按Alt+P或Alt+N键在之前输入的命令之间前后切换,Alt+P和Alt+N会不停地将命令复制到最后一行。如果找到了需要执行的命令,可以再次进行编辑,按下Enter键就可发送给解释器。按下Tab键则可以查看当前键入内容的自动补全列表,列表是基于Python关键字和用户自定义值生成的。
如果觉得可能处于挂起状态,无法显示新的提示符了,那么可能是解释器在等待用户输入。按下Ctrl+C发送中断命令,就能回到提示符状态,这也可以用于中断任何正在运行的命令。如果要退出IDLE,请在File菜单中选择Exit。
一开始用得最多的可能就是Edit菜单。与其他菜单一样,可以通过双击顶部的虚线将其解绑,让其位于窗口上端。
无论通过哪种方式使用Python的交互模式,都应该看到由3个三角括号“>>>”组成的提示符。这就是Python的命令行提示符,表示可以键入要执行的命令,或要计算的表达式。下面按惯例从“Hello, World”程序开始吧,用Python来实现只需要一行代码(每一行代码结束都要键入一个硬回车):
>>> print("Hello, World")
Hello, World
这里在命令行提示符后键入了print
函数,结果显示在了屏幕上。执行print
函数会将其参数打印到标准输出上(通常是屏幕)。如果是在运行Python代码文件时执行该命令,也会发生完全相同的事情,“Hello, World”将被打印到屏幕上。
恭喜!第一个Python程序就此完工了,而Python甚至还没开讲呢。
无论是在IDLE中,还是在标准的交互式命令提示符下,都有一些便利的学习工具来探索Python。第一个工具是help()
函数,它有两种模式。在命令提示符后输入help()
,即可进入在线帮助系统,从中可以获得有关模块、关键字或主题的帮助。帮助系统内的提示符是help>
,这时输入模块名称(如math
或其他主题),就能查看相关的Python文档。
通常可以用更有针对性的方式来使用help()
,这样会更为便捷。只要将类型或变量名称作为help()
的参数,就可以马上显示其帮助文档:
>>> x=2
>>> help(x)
Help on int object:
class int(object)
| int(x=0) -> integer
| int(x, base=10) -> integer
|
| Convert a number or string to an integer, or return 0 if no arguments
| are given. If x is a number, return x.__int__(). For floating point
| numbers, this truncates towards zero.
|
| If x is not a number or if base is given, then x must be a string,
| bytes, or bytearray instance representing an integer literal in the...
(continues with the documentation for an int)
以这种方式使用help()
,可以很方便地查看某个方法的确切语法和对象的行为。
help()
函数是pydoc
库的一部分,它在访问Python库内文档时有若干个参数可供选用。 因为所有Python安装完成后都会自带完整的文档,即使不能上网,全部官方文档也都唾手可得。有关访问Python文档的更多信息,参见附录A。
另一个有用的函数是dir()
,它列出了特定名称空间中的对象。在没有给出参数时,它会列出当前的全局变量,但它也可以列出某个模块中的全部对象,甚至某个类型的全部对象:
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
>>> dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>>
dir()
函数在查找方法和数据的定义时十分有用,可以一眼就看到属于某个对象或模块的全部成员。在调试代码的时候也很有用,因为在什么地方定义了什么都一目了然。
与dir()
函数不同,globals()
和locals()
函数会显示与对象关联的值。在目前情况下,这两个函数会返回相同的结果,所以这里只给出globals()
的输出结果:
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'x': 2}
与dir()
函数不同,globals()
和locals()
显示的都是与对象相关的值。在第10章中这两个函数将会更频繁地出现。好了,这足以说明,有多种方法可以查看Python会话内的当前状态。
[1] 这里按照Windows 10和Python 3.6.5(32位版)做了修正,原文中还带有“程序”菜单(the Python 3.6 (32-bit) entry on the Python 3.6 submenu of the Programs folder onthe Start menu)。——译者注
[2] 这里按照Windows 10和Python 3.6.5(32位版)做了修正,原文中为“IDLE (Python GUI)”菜单(the IDLE (Python GUI) entry of the Python 3.6 submenu of the All apps folder of your Windows menu)。——译者注