Python 快速入门(第3版)

978-7-115-50935-2
作者: [美]娜奥米·塞德(Naomi Ceder)
译者: 戴旭
编辑: 杨海玲
分类: Python

图书目录:

详情

这是一本Python快速入门书,基于Python 3.6编写,分为4个部分,第一部分讲解Python的基础知识,对Python进行概要的介绍,第二部分介绍Python编程的重点,第三部分阐释Python的高级特性,第四部分关注数据处理,最后给出了相关案例。 本书框架结构清晰,内容编排合理,讲解循序渐进,并结合大量示例和题目,既适合Python初学者学习,也适合作为专业程序员的Python参考书。

图书摘要

版权信息

书名: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的表现力是如何简化代码的,请考虑交换两个变量var1var2的值。在类似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时的特定平台说明。平台不同,情况可能会稍有差别,因此请务必阅读下载页面中有关各版本的说明。读者可能已经十分熟悉在自己机器上安装软件的过程,那就长话短说。

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中启动基础会话的步骤。

图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的方法。

图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)。——译者注


相关图书

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

相关文章

相关课程