首页>参考读物>计算机科学与技术>软件与程序设计

Python学习手册(原书第5版)
作者 : [美]马克·卢茨(Mark Lutz)著
译者 : 秦鹤 林明 译 林涵菲 审校
出版日期 : 2018-10-18
ISBN : 978-7-111-60366-5
定价 : 219.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 1514
开本 : 16
原书名 : Learning Python,5th Edition
原出版社: O'Reilly Media USA
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

如果你想动手编写高效、高质量并且很容易与其他语言和工具集成的代码,本书将快速地帮助你利用Python提高效率。本书基于Python专家的流程培训课程编写,内容通俗易懂。本书包含很多注释的例子和插图,以帮助你开始使用Python2.7和3.3。每章都包含关于Python语言的重要组成部分的一节课。本书主要内容:了解Python的主要内置对象类型,如数字、列表和字典;创建和处理对象的Python语句,学习Python的一般语法模型;利用Python的基本程序工具的结构和重用代码;了解Python模块:语句包、函数和其他工具;探索Python的面向对象的编程工具,用于构建代码;了解异常处理模型和开发工具编写较大的程序;探索先进的Python工具,包括装饰符、描述符、元类、Unicode的处理。

图书特色

图书前言

假如你正站在书店中,手里捧着这本书犹豫是否要买下,不妨看看下面三段话:
? Python 是一门强大的多范式计算机编程语言,它以程序员的多产、代码的可读及软件的高质量开发为目标而不断优化。
? 本书对Python 语言本身进行了全面而深入的介绍。目标是帮助你在工作中真正使用Python 之前,掌握Python 的基本原理并做好充足的准备。秉承本书前四版的一贯思路,本书这一版同样是所有Python 初学者的福祉,本书是一个独立的、全方位的学习资源,不论你将来使用Python 2.X、Python 3.X 或两者兼有。
? 本书第5 版已经更新到Python 的3.3 和2.7 发行版,并且进行了充分扩展以反映当今Python 世界中的一线实践。
这里的前言部分较为翔实地讲述了本书的目标、大纲以及结构。尽管是选读材料,但是它旨在协助你开始本书旅途之前,拥有一个大致的导览。
本书的“生态系统”
Python 是一门流行的开源编程语言,广泛用于各个领域的独立程序与脚本化应用中。它不仅免费、可移植、功能强大,同时相对简单,而且使用起来充满乐趣。从软件业界的任意一角到来的程序员,都会发现Python 着眼于开发者的生产效率以及软件质量,因此无论你的项目是大还是小,选择Python 都将带来战略性的优势。
不论你处于编程伊始,抑或身为开发专家,本书的目标都是使你跟上Python 语言的步伐,这是其他较局限的途径常常无法做到的。在读完本书后,你肯定会全面了解Python,并能自如地将它运用到你想探索的任何应用领域。
从创作之初,本书的定位就是一本强调核心Python 语言本身的教程,而不是Python 某一领域的特定应用。同样地,本书意图作为两卷书系列中的第一本:
? 《Python 学习手册》,就是本书,讲述Python 本身,着眼于横跨多领域的语言基本原理。
? 《Python 编程》,作为其他备选之一,会进一步向你展示在掌握Python 后如何使用它。
这种工作任务的分配是有意的。尽管使用目标可能因每个读者而不同,但是对有用的语言基本原理的介绍则不变。聚焦于应用程序的书籍,如《Python 编程》,会涵盖本书未涉及的内容,使用真实体量的示例来探索Python 在常见领域(如Web、GUI、系统、数据库,以及文本处理)中充当的角色。此外,《Python 袖珍指南》这本书提供了这里没有包含的参考材料,可以将其作为本书的补充。
由于本书着眼于Python 基础,因此它能够运用比许多程序员第一次学习这门语言时所见的更有深度的方式,展现Python 语言的基本原理。其自底向上的叙述方式,以及自包含、教导性的示例构思旨在一步一个脚印地教会读者Python 语言的全部内容。
在这一过程中你收获的核心语言技能,将来会应用到你遇见的每一个Python 软件系统中——它可以是当今流行的工具,如Django、NumPy 以及App Engine,或是其他可能成为Python 的未来与你编程生涯一部分的工具。
因为本书的前身是一个为期三天的Python 培训课程,从始至终带有测试和练习,所以本书也可作为这门语言的一个自学导论。虽然其形式缺少课堂般的现场互动,但是它在深刻性与灵活性方面进行了补偿,这是书籍所特有的优势。虽然本书有许多使用方法,但是按顺序阅读的读者会发现它大致相当于一门一学期长的Python 课程。
关于第5 版
本书第4 版出版于2009 年,涵盖了Python 2.6 与3.0 发行版。注1 整体上第4 版处理了在Python 3.X 系列中引入的许多有时不兼容的更改。此外,第4 版还引入了一款新的OOP 教程,以及新的章节,探讨了如Unicode 文本、装饰器及元类等高级主题,新的内容既取材于我本人在教学中实际使用的类,也借鉴自Python“最佳实践”的演化成果。
注1: 而2007 年短暂的第3 版涵盖了Python 2.5,以及其更简单的(并且更简短的)单行Python 世界。参见http://www.rmi.net/~lutz 获取关于本书历史的更多细节。多年以来,本书的篇幅和复杂度都在增长,且直接正比于Python 自身的增长。由附录C 可知,Python3.0 在这门语言中引入了27 个添加项和57 处更改,本书中已经可以看到它们的身影,而Python 3.3 延续了这一趋势。如今的Python 程序员面对着两种不兼容的语言系列、三种主要的范式、高级工具的过剩,以及狂风暴雨般的特性冗余——这其中的大部分在Python 2.X和3.X 系列间都不会整齐地划分。不过一切并没有听上去那么令人畏惧(许多工具其实是同一主题的变体),但是全部都是一个兼容并包、综合统筹的Python 大环境下的公平游戏。
成书于 2013年的第 5版是上一版本的修订本,新版本引入了大量更新,并采用了 Python 3.3以及 Python 2.7,它们是 Python 3.X和 2.X系列中的当前最新发行版译注 1。它涵盖了从本书上一版出版起,每一系列版本中所引入的全部语言特性更改,并且经过了从头至尾的打磨,因此不仅内容上与时俱进,而且措辞表达上也更加精准严谨。其中:
. 更新了对 Python 2.X的介绍,从而包含了像字典和集合推导这样的特性,这些特性之前只能在 Python 3.X中使用,但是现在已经向后移植到了 Python 2.7中,因此在 Python 2.7中可用。
. 对 Python 3.X中以下内容的介绍进行了扩增,包括新的 yield和 raise语法、 __pycache__字节码模型、Python 3.3命名空间包、PyDoc的全浏览器模式、Unicode字面量及存储修改,以及 Python 3.3配备的新的 Windows启动器。
. 新增了针对 JSON、timeit、PyPy、os.popen、生成器、递归、弱引用、__mro__、 __iter__、super、__slots__、元类、描述符、 random、Sphinx(斯芬克斯)等在内的许多主题配套的新增或扩展内容,而且也为 Python 2.X版本兼容问题提供了更多示例和描述。
这一版还添加了一个新的结尾(第 41章)、两个新的附录(附录 B和附录 C),以及新的一章(第 21章,该章扩充了第 4版中的代码计时示例)。你可以在附录 C中查阅在第 4版和第 5版之间 Python语言特性变化的简明总结,以及在本书中对相应内容介绍的指向。这一附录整体上还对 Python 2.X和 3.X之间最初的不同之处进行了小结,这些不同在第 4版中首次提出过,其中例如新式类这样的特性横跨了多个 Python版本,并最终在 Python 3.X中演化为强制的特性(稍后讲解 Python 2.X、3.X中“X”的含义)。
按照前面列出的最后一条,本书这一版也扩展了一些内容,比如它提供了更多关于高级的语言特性更为完整的介绍——我们中的许多人都曾非常努力想要忽视它们,因为它们中的大多数在过去 10年都并不常见,但放眼今天的 Python代码,它们中的大部分已经变得相当常见。我们也将看到,这些工具的出现使 Python变得更加强大,但是也提高了初学者的入门门槛,并且将改变 Python的领域与定义。由于你可能遇到这其中的任何一个,所以本书迎难而上,介绍了它们,而不是无视它们。
尽管进行了更新,但本书本版基本上保留了第 4版中绝大部分结构与内容,同时依旧旨在为读者提供一套针对 Python 2.X以及 Python 3.X的综合学习资源。尽管它主要着眼于 Python 3.3和 2.7(3.X系列的最新版以及可能是 2.X系列的最后一版)的用户,但它也同时兼顾到了如今还时常能碰到的更老版本的 Python代码的特性。
译注 1:截至本书中文版翻译时, Python官方的两个主要语言分支分别更新至 Python 3.6与 2.7。值得一提的是,一方面,从 Python 3.3到 3.6已经没有出现显著的基础语言特性变化;另一方面,比对现行见诸市面的 Python书籍,本书采取的 Python 3.3与 2.7版本能够更好地体现并覆盖大部分当前 Python流行版本的特性。
尽管不能预言未来,但是本书强调了近20 年一直有效的基本原理,并且也很可能将它们应用到未来的Python 版本中去。照例,我将在本书官方网站上跟进对本书有影响的Python更新。在Python 官方网站文档中的“What’s New in Python”译注2 栏目也能够补充Python在本书出版后的演化所带来的差异。
Python 2.X 与3.X 系列
由于Python 2.X/3.X 的故事在本书中的地位非常重要,我在这里提前说明一下。在本书第4版成书的2009 年,Python 开始了两种风格的演化:
? 版本3.0 是通常名为3.X 系列中的第一版,这一系列相当于Python 语言的一次断代升级。
? 版本2.6 保留了与已有Python 代码的庞大身躯向后兼容的特性,并且在整体上是2.X系列中的最新版本。
虽然3.X 大体上是同一门语言,但是它几乎不能运行先前版本中所写的任何代码。它:
? 采用了一种Unicode 模型,对字符串、文件及库产生了广泛的影响。
? 把迭代器和生成器提升为一个更加核心的角色,使它们成为更完整的函数式编程范式的一部分。
? 强制使用新式类(new-style class)模型,将类(class)与类型(type)相合并,也让新式类模型变得更加强大和复杂。
? 更改了许多基本工具与库,并对其中的一些进行了替换或移除。
单看将print 从语句改为函数这一变化,我们就能体会到尽管对语言设计的审美得到了满足,但也破坏了曾经编写的几乎每一个Python 程序。抛开语言设计的战略潜力不谈,3.X强制的Unicode 及新式类模型,还有随处可见的生成器,创造了一种全新的编程体验。
尽管许多人将Python 3.X 视为对Python 的改进和未来发展的趋势,但是Python 2.X 仍然广为使用,并且在未来数年,都将以平行于Python 3.X 的方式被支持。由于业界Python 代码的主体还是2.X,向3.X 迁移的过程注定是缓慢的。
当今Python 2.X/3.X 的故事
尽管截至本书第5 版,Python 已经推出了发行版3.3 以及 2.7,但是这个2.X/3.X 的故事仍旧大体不变。事实上,Python 现在是一个二重版本的世界,许多用户根据其软件目标及依赖,既运行2.X,又运行3.X。对于许多初学者而言,在2.X 与3.X 之间的选择,演变成了在已有软件与语言前沿之间的一次取舍。尽管许多主流Python 包已经移植到了3.X,但是现今的许多其他包仍然只用2.X 编写。
译注2: What’s New in Python 是Python 官方文档中记录每一版本新增语言特性的栏目,网址为https://docs.python.org/3/whatsnew/index.html。感兴趣的读者可以访问查看。

对于一些人来说,Python 3.X 现在被看作探索新思想的沙箱,而2.X 则被视为经实践检验过的Python,它没有3.X 的全部特性,但是如同涓涓细流,渗透到每一处角落。对其他人来说,将Python 3.X 视作未来,这一观点似乎已经被当前核心开发者计划所接受:Python2.7 将继续被支持,但是将成为2.X 的最后一个版本,而3.3 则作为3.X 系列持续演化进程中的一步继续走向未来。
另一方面,如PyPy 这样的方案(当今一款仍然只支持2.X 的Python 实现,提供了极其优异的性能改善)代表了一种2.X 可能的未来,不过你也可以把它们看作另立大旗、自成一派。
抛开所有的主观看法,在3.X 发行将近5 年后,它尚未取代2.X,甚至还未拥有能够与之匹敌的用户数。作为一项评判标准,在当今的python.org 官方网站,就Windows 系统而言,2.X下载频率仍然比3.X 高,按理来说这一统计应该偏向新用户和最新发行版。当然,这样的统计易于变化,但是它也反映了这5 年来3.X 的使用状况译注3。对于许多人来讲,已有的2.X 软件基础库因素仍旧胜过3.X 的语言扩展。此外,2.7 已是2.X 系列的最后一版,这使得2.7 成为某种事实上的标准,因此不受3.X 系列恒定幅度变化的影响——对于寻求稳定基础库的人而言,有着正面作用;对于寻求增长和持续相关性的人而言,则有着负面作用。
就我个人而言,我认为当今的Python 世界非常广阔,足以同时容纳3.X 和2.X;它们似乎满足着不同目标,吸引着不同的阵营,并且纵观其他语言也不乏先例(例如C 和C++,有着长时间的共存,而且它们之间的差异可能比Python 2.X 同3.X 之间的差异还大)。此外,因为它们是如此相似,以至于学习任一Python 系列所收获的技能几乎都可以完整移植到另一系列,尤其在你借助于像本书这样兼顾到版本差异性的学习资源时。事实上,只要你明白它们之间是如何相互区别的,你将很容易编写在两个版本中都能运行的程序。
与此同时,这种版本间的分裂给程序员和书籍作者都出了一道难题,而且这道难题还几乎不能回避。对于一本书而言,假装Python 2.X 从未存在而只涵盖3.X 的内容,是一件更简单的事,但是这将不能满足当今已有的巨大Python 用户基数的需求。目前海量的已有代码是用Python 2.X 编写的,而这些代码不会很快就过时。尽管一些语言的初学者能够并应该致力于Python 3.X,但是任何必须使用过去编写的代码的人,都需要涉足当今的Python 2.X世界。由于在将许多第三方库和扩展移植到Python 3.X 之前仍有数年的时间,所以这一分歧将会长期存在。
译注3: Python 3.0 发布于2008 年,到本书英文版出版的2013 年正好5 年。截至本书中文版翻译时,最新的比较有代表性的2.X 和3.X 版本使用情况数据由Jetbrains 公司提供:在2016 年PyCharm 编辑器的用户中,72% 采用2.X,40% 采用3.X(其中包括两个版本都使用的程序员),统计数据链接https://www.jetbrains.com/pycharm/python-developerssurvey-2016/。
对3.X 和2.X 的介绍
为了解决这一二岔分歧,并满足全部潜在读者的需求,本书为此进行更新,涵盖了Python 3.3 与2.7,并且能够迁移到3.X 和2.X 系列随后的发行版中。它意图为Python 2.X 程序员、Python 3.X 程序员,以及游走于这两个系列之间的程序员提供方便。
也就是说,你可以使用本书来学习两者中的任意一个Python 系列。尽管3.X 经常被强调,对于使用老式代码的程序员而言,2.X 的不同和工具也需要一直注意。虽然两个版本系列大体上是相似的,但它们在一些重要的方面存在差异,而我将在这些差异出现的时候指出来。
例如,我将在大多数示例中使用3.X 的print 调用,但是也将讲述2.X 的print 语句,这样你就能理解早期的代码,并且经常使用在两个系列上都能运行的可移植打印技巧。我还将大量地介绍新的特性,诸如3.X 中的nonlocal 语句,以及从Python 2.6 和3.0 起可用的字符串format 方法,当这样的扩展在老式Python 中不能使用时我将予以指明。
通过代理,本书也说明了其他的Python 2.X 和3.X 发行版,虽然一些老式版本的2.X 代码也许不能运行这里的全部示例。例如,虽然从Python 2.6 和3.0 起类装饰器是可用的,但是你不能在还没有这一特性的老式Python 2.X 下使用它们。照例,你可以参看附录C 的更改表格,从而获取最新2.X 和3.X 更改的总结。
我应该选择哪个Python
版本选择可能由你所效力的组织机构强制规定,但是如果你是Python 新手并且自主学习,那么你可能想知道应该安装哪一版本。答案取决于你的目标。下面是一些帮助你做出选择的建议。
选用3.X 的情形:新的特性、演化
如果你第一次学习Python 并且不需要使用任何已有的2.X 代码,建议你以Python 3.X开始。它清理了这门语言中长期存在的一些瑕疵,并修剪了一些陈旧的、不整齐的枝枝叶叶,同时保留了全部初始的核心思想,还添加了一些令人振奋的新工具。例如,3.X的无缝Unicode 模型,以及对生成器和函数式编程技巧的更广泛使用,被许多用户视为一笔财富。很多流行的Python 库与工具已经或即将在你读到这段话的时候支持Python 3.X,尤其是考虑到3.X 系列持续不断的改进时。所有新的语言演化仅发生在3.X 中,这些变化增加了特性并保持与Python 密切相关,不过也让语言的定义成为一个时常移动的靶子—— 一种在语言前沿上的固有权衡。
选用2.X 的情形:已有代码、稳定性
如果你将使用一个基于Python 2.X 的系统,那么现今的3.X 系列对你可能不是一个选项。无论如何,你将发觉本书也能帮你处理忧虑,如果未来迁移到3.X,本书将会帮助到你。你还会发现你其实并不孤单。我在2012 年培训的每一个小组都只使用2.X,并且我仍旧定期见到仅以2.X 形式呈现的实用Python 软件。此外,不同于3.X,2.X 不会再被修改——这既是一笔财富,也是一笔债务,取决于你所扮演的角色。使用并编写2.X 代码是无可厚非的,但是你也会希望尽可能地密切关注3.X 及其动向。Python 的未来留待书写,并且很大程度上将最终由其用户决定,包括你在内。
同时选用两者的情形:版本中立的代码
很可能这里最好的消息就是,在其两个系列中,Python 的基本原理都是相同的——2.X和3.X 只会在许多用户觉得细微的方面不同,而本书旨在帮助你学习这两者。事实上,只要你理解它们不同的原因,就能写出在两个Python 系列上都可以运行的版本中立的代码,这也是我们在本书中经常做的。你可以参看附录C 以获取有关2.X/3.X 的迁移指南,以及有关编写针对两个Python 系列和两类受众的代码的小窍门。
不管一开始从哪个(或哪些)版本上手,你的技能都将直接迁移到你的Python 工作所指引的方向上去。
注意: 关于X 记号:贯穿本书,“3.X”同“2.X”用来整体代指两个系列里的全部发行版。例如,3.X包括从3.0 到3.3 的所有发行版以及未来的发行版;2.X 则表示从2.0 到2.7 的全部发行版(2.X 预计再没有其他版本)。更加精确的发行版只在一个主题应用于它时会被提起(例如,2.7 的集合字面量与3.3 的启动器和命名空间包)。这种提法偶尔会过于宽泛(一些这里标注为2.X 的特性可能不会在早期的2.X 发行版中出现,而这些早期版本今天已极少使用),不过我们也要考虑到2.X 系列已横跨10 余年的事实。相反,3.X 的标签则更加简单、更为准确。
本书的必备知识与意图
我几乎不可能列出本书所需要的绝对必备知识,因为它的实用性和价值不仅依赖于读者的背景,也同样多地依赖于读者的动机。真正的初学者,以及执拗的编程老手在过去都曾成功地使用过本书。如果你有学习Python 的动机,愿意投入时间和精力,那么这本书将非常适合你。
很多人都会问,学习Python 到底要花多少时间?尽管答案因人而异,但只要你开始阅读,就已经离完成不远了。一些读者可能将本书当作一个即查即用的工具书,但是大多数希望精通Python 的人应该预期会花费数周的时间,也可能是数月的时间,来通读本书,这取决于他们研究本书示例的深入程度。如前所述,本书大致相当于有关Python 语言自身为期一学期的一门课程。
这仅仅是对学习Python 语言本身以及将它使用好的软件技能的预估。尽管本书足以满足基本的脚本编程目标,但那些希望将软件开发作为职业的读者应该计划在读完本书后,投入额外的时间到大型项目开发中。如果可能的话,投入额外的时间阅读本书的续集,如《Python编程》。注2
对于希望立即精通的人们,那可能不是一条受欢迎的消息,但编程并不是一项简单的技能。(忘了你听过的那些心灵鸡汤吧!)今日的Python 和通用软件知识,都有足够的挑战性和较高的回报率,值得你付出像本书这样的综合书籍所暗示的努力。这里是一些有关使用本书的指南,同时适用于初出茅庐与驾轻就熟的读者。
对于有经验的程序员
你拥有起初的优势,并能够迅速翻阅一些靠前的章节;但是你不应该跳过其中的那些Python 专属的核心思想,并可能需要努力放下一些既有的“经验”。笼统地讲,在本书之前接触任何编程或脚本语言都是有帮助的,因为这能帮助你形成类比。另一方面,我还发现由于在其他语言中根植的成见,先前的编程经验也可能成为一种阻碍。(根据所写的第一份Python 代码,认出课堂中的Java 或C++ 程序员真是太容易了!)要用好Python 需要你接纳它的思维模式。通过着眼于关键的核心概念,本书旨在以Python的方式来帮助你学习编写Python 代码。
对于真正的初学者
在本书中你能同时学习Python 以及编程本身;但是你可能需要更加努力一点,而且需要参考阅读其他更加容易的介绍资料来辅助学习。如果你还没有把自己当作一名程序员,你也有可能发现本书会帮到你,但是你要确保缓慢地前进,并且一路认真完成示例和习题。还要牢记,本书会花比讲授编程基础知识更多的时间来讲授Python 本身。如果你发现自己因困惑而迷失在这里,我鼓励你在着手阅读本书之前,先了解一下通用的编程导论。Python 官方网站提供了许多面向初学者的有用资源链接。
正式地讲,本书旨在成为所有初学者的第一个Python 读本。对于一些之前从没有接触过电脑的人,它可能不是一种理想资源(例如,我们不会花费任何时间来了解电脑是什么),但是关于你的编程背景和学历,我没有做过多假设。
另一方面,我也不会把读者当作“傻瓜”来事无巨细地解释所有细节,毕竟在Python 中做些有用的事很容易,而本书将会指引你怎样做。书中也偶尔会拿Python 同其他语言(如C、C++、Java)做对比,但是如果你过去没有使用过这样的语言,你大可放心地忽略这些比较。
注2: 标准免责声明:我撰写了本书和先前提过的另一本书,两者可作为组合一起使用:《Python学习手册》讲授了语言的基本原理,《Python 编程》讲授了应用程序编写的基础知识,而《Python 袖珍指南》则可作为前两本的伴侣书目。这三本书全部都起源于1995 年最初的、宽泛的《Python 编程》这本书。建议你探索当今许多可读的Python 书籍(在亚马逊网站Amazon.com,我刚刚随意一数就有超过200 本,因为相关的书目几乎不可计数,而这还不包括相关主题的书籍,如Django)。我自己的出版商最近出版了一系列关于Python的书籍,有关仪器设备、数据挖掘、App 引擎、数值分析、自然语言处理、MongoDB、AWS 等——一旦你掌握了这里的Python 语言基本原理,这些都将成为你可以探索的特定领域。今天的Python 故事太过丰富,任何一本书都无法独自讲完。
本书的结构
为了帮助你上手,本节提供了本书所有主要部分内容和目标的一个快速概要。如果你万分焦急,想要开始本书的学习,你大可略过这一节(或浏览全书目录)。然而,对于一些读者而言,这样大部头的一本书非常值得拥有一张预先的简明路线图。
经过构思,每一部分都涵盖了这门语言的一个主要功能区,而每一部分都由若干章组成,这些章节聚焦于本部分功能区的一个特定主题或方面。此外,每一章以习题及其答案结束,而每一部分以更大型的练习题结束,练习题的解答在附录D 中给出。
注意: 实践很重要:我强烈推荐读者完成本书中的全部测试题与练习题。在编程领域,没有任何事物能够替代将你的所读付诸实践。无论你在本书中或你自己的项目中是否践行这一点,实际编写代码都能有效地帮你加深和强化书中提到的思想。
总体上讲,本书的组织形式是自底向上的,因为Python 语言本身也是如此。随着我们不断前进,书中的示例与主题也将变得越来越有挑战性。例如,Python 的类基本上仅仅是处理内置类型函数的包。一旦你掌握了内置类型和函数,理解类就相对容易了。由于每一部分都建立在位于其之前的、逻辑相关的部分之上,对于绝大多数读者来说,按顺序阅读才是最合适的。以下是你将学习的本书主要部分的预览:
第一部分
我们以Python 的一个总体概览开始,其中回答了经常会被问到的初步问题——为什么人们使用这门语言,它能做些什么,等等。第1 章介绍了潜藏于技术之下的主体思想,为你提供一些背景知识。本部分的剩余章节将继续探讨Python 以及程序员运行程序的方式。主要目的是为你提供充足的信息,以便你能跟上随后的示例与习题。
第二部分
接下来,我们开始Python 语言之旅,深入学习Python 的主要内置对象类型如数字、列表、字典等,以及利用它们所能做的事情。你可以单独使用这些工具完成很多事情,而它们是每段Python 脚本的核心。这是本书最重要的部分,因为这部分为随后的章节奠定了基础。我们还将在这一部分探索动态类型及其引用(这是用好Python 的关键)。
第三部分
这一部分我们将继续介绍Python 的语句,即你输入并创建的代码,同时还将在Python中处理对象。这一部分还介绍了Python 的通用语法模型。尽管本部分关注于语法,但是它也介绍了一些相关的工具(如PyDoc 系统),第一次引入迭代的概念,并探索了编程替代方法。
第四部分
本部分开始关注Python 中较高层次的程序结构工具。函数其实是打包代码并重用的一种简单方式,它避免了代码冗余。在本部分,我们将探索Python 的作用域规则、参数传递技巧,以及时常为人不齿的lambda 表达式等。我们还将以函数式编程的视角回顾迭代器,引入用户定义的生成器,并学习如何为Python 代码计时以测试代码性能。
第五部分
Python 模块允许你将语句和函数组织为更大的组件,本部分展示了如何创建、使用以及重新加载模块。这里我们还将关注一些更高级的主题,如模块包、模块重新加载、包相关导入、3.3 版本的新命名空间包,以及__name__ 变量。
第六部分
这里,我们探索Python 的面向对象编程工具,类——一种可选但是强大的组织代码以便定制和重用的方式,使用它能自然地将代码冗余程度降到最低。正如你将看到的,类几乎都会重复使用我们到本书目前为止所介绍的思想,而Python 中的OOP 基本上就是关于在相互链接的类组成的类树中查找名称,以及在类的方法中特殊的第一位参数self。正如你还将看到的,在Python 中OOP 是可选的,但是大部分人都觉得Python 中OOP 的简洁性远胜于其他语言,而且OOP 还能够极大地削减开发时间,尤其对于长期的战略项目研发更为明显。
第七部分
本部分将总结本书关于语言基本原理的介绍,并关注Python 的异常处理模型及语句,同时对开发工具进行一个简明概览。当你开始编写大型程序时,这些工具将变得更加有用(例如调试和测试工具)。尽管异常是一种相当轻量级的工具,但把这一部分安排在类后面讨论,是由于用户定义的异常在现在的Python 版本中本质上都是类。这里我们还介绍了一些更高级的工具,如上下文管理器。
第八部分
在最后这个部分,我们会探索一些高级主题:Unicode 与字节串、诸如property 和描述符的属性管理工具、函数装饰器和类装饰器以及元类。这些章全部是选读的,因为不是所有程序员都需要理解它们所应对的课题。另一方面,必须处理国际化文本或二进制数据的读者,或需要开发供其他程序员使用的API 的读者,应该会在本部分发现一些有用的内容。这部分的示例也比本书中的大多数示例庞大,因此能充当自学材料。
第九部分
本书以四个附录的组合圆满结束,它们给出了在不同计算机上安装和使用Python 的特定平台相关的小窍门;展示了Python 3.3 配备的新Windows 启动器;总结了本书最近几版涉及的Python 版本中的更改,并给出了相关网上资源的链接;提供了每部分末尾练习题的解答。而每一章的“本章习题”的答案则出现在对应的章节中。
你也可以参看目录,以获取对本书组成更加细粒度的概览。
本书不是什么
考虑到多年以来本书相对大规模的读者群体,一些人不可避免地会期待本书扮演其职能外的角色。因此,尽管我已经告知你这本书是什么,我还想澄清这本书不是什么:
? 这本书是一本教程,不是参考手册。
? 这本书介绍语言自身,而不介绍应用程序、标准库或第三方工具。
? 这本书以系统化的视角,审视一个庞大的主题,而不是一本流水账般的概览。
因为这些要点对于本书内容十分关键,关于它们我还想预先再讲一些。
它不是一本参考手册,也不是一本特定领域应用程序的指南
本书是一本编程语言教程,不是参考手册,也不是应用程序书籍。这是经过构思的:现今的Python 拥有内置类型、生成器、闭包、推导、Unicode、装饰器,以及过程式、面向对象及函数式编程范式的混合。这使得单单核心语言自身就是一个庞大的主题,它同时也是你未来全部Python 工作的必备知识,无论你从事哪个领域。当你准备好开始学习其他资源时,下面是给你的一些建议和提醒:
参考资源
正如前面的本书结构描述所暗示的,你可以使用索引和目录来搜寻细节,但是本书没有任何参考文献附录。如果你正在寻找Python 的参考资源(且大部分读者很快将会在他们的Python 生涯中开始这种寻找),我推荐前面提到的那本书,我把它写为本书的姊妹篇(《Python 袖珍指南》)。我也建议你采用其他带有快速搜索的参考书目,以及在http://www.python.org 维护的标准Python 参考手册。其中后者是免费的,而且在持续更新,可以从网络上阅读,也可以在电脑上阅读它。
应用程序和库
如前所述,本书不是一本如Web、GUI 或系统编程这类特定应用程序的指南。取而代之的是,本书包括了一些你在编写应用程序中将用到的库和工具;虽然这里介绍了一些标准库和工具(包括timeit、shelve、pickle、struct、json、pdb、os、urllib、re、xml、random、PyDoc,以及IDLE),然而它们并不是本书主要介绍的内容。如果你是在寻找更多关于这类主题的讲解,或是你已经精通了Python,那么我会向你推荐《Python 编程》这本书。不过,《Python 编程》一书假设本书的内容作为其必备的基础知识,因此,请首先确保你扎实的掌握了这门语言的核心内容。特别是在软件这类工程领域,一个人在跑步之前必须先学会走路。
它不是行色匆匆人们的一本快餐读物
你从本书的篇幅也能判断出书中不乏详尽的细节:它讲述了完整的Python 语言,而不只是其简化子集的简单概览。一路上它也涵盖了整个软件学的原理,这些知识对写出好的Python 程序是必要的。正如前面提到的,这是一本需要花费数星期或数月来阅读的书,旨在向你传授要从一门有关Python 的一整学期课程才能掌握的技能水平。
这也是有意而为的。当然,本书的许多读者不需要掌握完整量级的软件开发技能,而且一些读者能够以一种零碎的方式吸收Python。但与此同时,因为语言的任何部分都可能用于你将来遇到的代码中,对于大部分程序员来说,书中没有任何一部分内容是真正可跳过的。此外,即使轻松的脚本编写者和爱好者也需要了解软件开发的基本原理,以便写出更好的代码以及恰到好处地使用预编写的工具。
这本书力争满足“语言”和“原理”这两个方面的需求,并拥有足够的深度以便更实用。因而,在你逐章阅读本书并熟练掌握相关的预备知识后,终将发现Python 中那些所谓高级的工具(例如对面向对象和函数式编程的支持)其实也都唾手可得。
它以Python 原本的方式顺序展开
谈到阅读顺序,本书也努力尝试最小化前向引用,但是Python 3.X 的改变使这一目标在一些情形下变得难以实现。(事实上,当你学习时,Python 3.X 有时似乎假设你已经了解它了!)一些代表性的例子包括:
? 打印、排序、字符串format 方法,以及一些依赖函数关键字参数的dict 调用。
? 字典键列表与测试,以及许多工具周围使用的list 调用,暗含有迭代的概念。
? 使用exec 运行代码现在假定你已经掌握文件对象与接口的相关知识。
? 编写新式的异常需要你掌握类和OOP 的基本概念。
? 诸如此类——甚至基本的继承也引入了高级主题(如元类和描述符)。
由简至繁逐步前进仍旧是学习Python 的最佳方式,因此这里顺序阅读是最有意义的。依然,一些主题可能需要非顺序跳读与随机查找。为了将非顺序阅读的程度降到最低,当向后依赖出现时,本书将会指出它们,并会尽可能地缓解它们的影响。
注意:假如你时间紧张:尽管深度对于掌握Python 至关重要,但一些读者很可能时间有限。如果你希望开启一段快速的Python 旅程,我建议阅读第1 章、第4 章、第10 章及第28 章(也许还有第26 章)—— 一个简短的调研有助于激发你对本书剩余部分所讲述的更为完整故事产生兴趣,这些是大部分读者在现今的Python 软件世界里所需要的。整体上看,本书被有意地以此种方式分层,以使其材料更易于读者吸收——本书的介绍伴随着细节,因此你能够从概览开始,并随时间的推移深入挖掘。你不必一口气阅读完本书,其平缓的介绍方式将帮助你理解它所包含的内容。
本书的程序
通常,本书总是竭力对Python 版本与平台保持客观中立。它旨在面向全体Python 用户。虽然如此,因为Python 随时间改变,且各个平台在实践中有所不同,所以我会介绍你将在本书大部分示例中遇到的实际的特定平台。
Python 版本
本书的全部程序示例,都基于Python 3.3 和2.7。此外,许多示例都可以在之前的3.X 和2.X发行版下运行,并且有关在早期版本中语言更改历史的提示会一路搭配在本书中,以照顾老式Python 的使用者。
由于本书聚焦于语言核心,因此本书要讲的大部分内容在未来Python 发行版中都不会有太大改变。除了少数地方,本书大部分内容也都能应用于较早的Python 版本;当然,如果你尝试使用一个发行版中新增的扩展,那么情况就与此不同了。根据以往经验,如果你具备自我提升的自学能力,那么最新的Python 就是最好的Python。
因为本书聚焦于语言核心,所以它的大部分内容还适用于Jython 和IronPython,它们是基于Java 和.NET 的Python 语言实现,同样也适合其他Python 实现,如Stackless 与PyPy(在第2 章讲述)。这样的替代方案在使用细节上有很大不同,而不是在语言定义上。
平台
本书中的示例曾经运行于Windows 7 和8 的超级本,注3 但是Python 的可移植性使其成为一个悬而未决的问题,尤其是在着眼于基本原理的本书中。你会注意到一些Windows 主义的事物(包括命令行提示符、少量的屏幕截图、安装指示,以及一篇有关Python 3.3 中新Windows 启动器的附录)。不过它们都反映了这样一个事实,大多数Python 入门者很可能从Windows 平台上开始学习,而其他操作系统的使用人员可以放心地忽视这些内容。
我还会给出像Linux 这样的其他平台上的启动细节,诸如对“#!”行的使用,但是正如第3章和附录B 所述,即使是此种用法,Python 3.3 的Windows 启动器也使它成了一种更具移植性的技巧。
获取本书的代码
本书示例的源代码,以及练习题的解答,可以在下面给出的本书网站上以zip 文件格式获取:http://oreil.ly/LearningPython-5E
注3: 大部分在Windows 7 环境下运行,但是这与本书主题无关。在写作本书时,Python 安装在Windows 8 上,并在其桌面模式下运行,这本质上与我所写的没有开始按钮的Windows7 是相同的( 你可能需要为从前的开始按钮菜单项创建快捷方式)。而对WinRT/Metro“app”的支持依旧处于待定状态。参看附录A 以获取更多细节。坦白地讲,当我写下这段文字时,Windows 8 的未来是不明朗的,因此本书将尽可能地保持版本中立。

这个站点既包括本书中的全部代码,也含有包使用说明,因此你可以在其中寻求更多的细节。当然,在本书的上下文中运行相应的示例能够让你获得最佳的学习体验,而通常你也将需要一些运行 Python程序的背景知识来利用这些示例。我们将在第 3章学习启动细节,因此请继续学习有关这方面的信息。
使用本书的代码
本书中的代码旨在讲授相关知识,如果代码在力所能及的范围内帮到你,我将非常高兴。 O’Reilly出版社自身拥有关于一般性重复使用书籍示例的官方政策,我将它们粘贴到这里以供参考:
本书的目的是帮助你完成工作。通常,你可以在你的程序和文档中使用书中的代码。你不必联系我们来获得许可,除非你复制了很大一部分的代码。例如,编写一段使用本书中若干代码块的程序并不需要许可。出售或发布一张 O’Reilly出版社书中示例的 CD-ROM则需要许可。通过引述本书及引用示例代码来回答一个问题不需要许可。在你产品的文档中包含本书中大量的示例代码则需要许可。
我们感谢,但是不强求你注明引用。引用注明通常包括书名、作者、出版社,以及 ISBN。例如,“Learning Python, Fifth Edition, by Mark Lutz. Copyright 2013 Mark Lutz,978-1-4493-5573-9”。
如果你觉得对代码示例的使用超出合理范围,或在以上给出的许可范围之外,那么请联系我们,邮箱 permissions@oreilly.com。
字体约定
当然,你开始阅读后就会明白本书的排版机制,不过作为参考,本书使用了如下的排版约定:
斜体(Italic)
用于电子邮件地址、URL、文件名称、路径名称,以及强调第一次引入的新术语。等宽字体(Constant width)用于程序代码、文件内容和命令行输出,以及指明模块、方法、语句和系统命令。
等宽粗体(Constant.width.bold)
在代码片段中使用,显示命令以及需要由用户输入的文本,并且偶尔被用来突出代码的个别部分。
等宽斜体(Constant width italic)
用于可替换的文字和代码片段中的一些注释。
注意: 表示一个小贴士、建议或有关附近文本的通用提示。
警告: 表示附近有关文本的一种警告或警示。
纵观全书,你还会发现偶尔出现的边栏(由方框分隔)和脚注(在页脚),通常为选读内容,但是提供了有关主题的额外背景。例如,像“请留意:分片”这样的边栏,经常给出示例使用案例,补充正在被探索的主题。
书籍更新与资源
本书的更新、增补,以及更正(勘误)将在网页上维护,你可以在出版社的网站上或通过邮件来参与提议。以下是一些主要联系方式:
出版社的网站:http://oreil.ly/LearningPython-5E
这个网站维护本书的官方勘误列表,以及按照时间记录的用于重印本书的补丁。它还是前面介绍的本书示例的官方网站。
作者网站:http://www.rmi.net/~lutz/about-lp5e.html
这个网站将用于发布有关本书内容或Python 自身更为通用的更新——用以应对未来的变化,你也可以将它看作本书的某种虚拟附录。
我的出版商也有一个电子邮件地址,用来收集有关本书的评论和技术问题:
bookquestions@oreilly.com
info@mail.oreilly.com.cn
想要了解有关我的出版商的书籍、研讨会、资源中心以及O’Reilly 网络等的更多信息,请参看它的综合网站:
http://www.oreilly.com
http://www.oreilly.com.cn
想要了解我写作书的更多信息,请参看我自己的书籍支持站点:
http://www.rmi.net/~lutz
如果前面的任何链接因时间久了而变得无效,那么还需要你自己搜索网络来确认;毕竟今天的网络瞬息万变。
致谢
当我在2013 年写作本书第5 版时,过去的时光在我脑海中依旧挥之不去。到现在,我已经使用和推广Python 20 余年,写作关于它的书籍18 年,讲授以它为主的实体课程16 年了。
尽管时间流逝,我现在仍旧不时会惊讶于这门语言所获得的成功——这种成功对于20 世纪90 年代的我们来说几乎是无法想象的。因此,冒着被当作一名极度自恋的作者的风险,我还是希望你能原谅结尾前这里的回顾之语与感激之词。
幕后故事
我自己与Python 的相识在时间上要早于Python 1.0 和网络时代(并且可以追溯到这样一个时间点,那时人们认为安装网络就意味着获取电子邮件信息、拼接、解码,同时祈求一切都顺利进行)。作为一名受挫的C++ 软件开发人员,当我在1992 年第一次发现Python 时,对于它将在我人生中接下来的20 年产生何种影响,我根本一无所知。我在1995 年完成了面向Python 1.3 的《Python 编程》一书的第1 版。两年后,我开始了周游全国和全世界的旅行,并为入门者以及专家讲授Python。由于在1999 年完成了《Python 学习手册》的第1 版,我成为一名独立的Python 培训师与作家,某种程度上也多亏了Python 呈现象级增长的受欢迎程度。
下面是我折腾到现在的结果。我目前已经撰写了13 本Python 书籍,按我自己的统计,总计大概售出40 万本。我已经教授Python 课程5 年;在美国、欧洲、加拿大及墨西哥讲授了约260 堂Python 训练课;并且一路上遇到了4000 多名学生。除了推着我向一个飞行常客的理想国不断前进外,这些课堂帮助我完善了这里的文字以及我的其他Python 著作。教书打磨了教材,反之亦然,最终的结果就是我的书籍十分贴近我的课堂,并且能够充当课堂之外、独立可行的替代解决方案。
至于Python 本身,随着最近几年的不断成长,它已跻身于全世界使用最广泛的编程语言中的前5 ~ 10 名(具体排名依赖于你引用了哪个来源,以及引用的时间)。因为我们将在本书的第1 章探索Python 的地位,所以我会推迟这个故事的剩余部分在那里讲述。
感谢Python
因为教授Python 教会了我如何去教课,所以本书很大程度上归功于我的线下课堂。我要感谢所有参加我课程的学生。伴随着Python 自身的变化,你们的反馈对于这里文字形成的影响是无可替代的;没有什么比亲身在现场经历过4000 人重复一些初学者易犯的错误更具教育意义了!本书最近几版的修订基于现场教学,主要来源于近期开设的培训班,当然从1997 年起的每堂培训课都或多或少地为本书的成书提供了帮助,但根本上也归功于最近的课堂。我想感谢所有的客户,你们主持了在都柏林、墨西哥城、巴塞罗那、伦敦、埃德蒙顿,以及波多黎各等地的课堂;这样的经历是我职业生涯中最持久的回报之一。
因为写书教会了作家如何去写作,所以本书很大程度上还要归功于它的读者。我想感谢我的读者朋友们,在过去的8 年多,你们抽出时间,以线上和线下的方式,贡献了宝贵建议。你们的反馈对于本书的改进也是至关重要的,同时也是本书成功的一个重要因素,在开源的世界,这似乎是一种先天的优势。而读者的评论包罗万象、无处不在,从“你应该被禁止写作”,到“上帝保佑你写出这本书”;如果说在这样的事情上达成共识是可能的话,它很可能处于两者之间,借用来自托尔金的一句话:书还是太短了。
对于每一位在本书出版过程中贡献力量的人,我都致以衷心的感谢。对于那些多年以来帮助本书成为一件可靠产品的人们,包括编辑、排版人员、营销人员、技术审校等,我都致以衷心的感谢。我还想感谢O’Reilly 出版社,给予我创作13 本书的机会;这个过程是充满乐趣的(不过只是有点像电影《土拨鼠之日》译注4)。
此外,我还要感谢整个Python 社区;同大部分开源系统一样,Python 也是为数众多、默默无闻的贡献者创作的产品。我非常荣幸能够见证Python 从一个脚本语言的懵懂孩童,成长为一种广为使用的工具,并以一种潮流的方式被几乎每一个编写软件的组织机构所使用。抛开技术性的争论,这个奋进的过程从始至终都是激动人心的。
我还想感谢O’Reilly 出版社我最初的编辑,已故的Frank Willison。本书基本上是Frank 的想法。他对于我的职业生涯,以及Python 新诞生时所取得的成功,都有深远的影响,每当我忍不住错误使用“只有”这个词时,我都会回想起这份馈赠。
私人感谢
最后是一些更加私人的感谢之词。感谢已故的Carl Sagan,你鼓舞了一个18 岁的威斯康辛少年。感谢我的母亲,您给我勇气。感谢我的兄弟姐妹,是你们陪伴我发现博物馆中的秘密。感谢《浅薄》The Shallows 这本书,为我敲响了急需的警钟。
感谢我的儿子Michael 和女儿Samantha 与Roxanne,你们令我欣慰。我不知道你们长大后的模样,但是我为你们现在的一切感到骄傲,并期望看到生活下一步引领你们所去往的方向。
感谢我的妻子Vera,你的耐心、不离不弃、健怡可乐以及蝴蝶脆饼。我无比庆幸能在生命中与你相遇。我不清楚接下来的50 年会发生什么,但我唯一确信的是,我希望这全部的50 年都能陪伴在你身旁。
——Mark Lutz,2013 年春于Larch
译注4: 美国电影《土拨鼠之日》讲述了男主人公的生活定格于“土拨鼠日”,不断重复度过同一天的神奇故事。

上架指导

计算机\程序设计

封底文字

本书将帮助你使用Python编写出高质量、高效的并且易于与其他语言和工具集成的代码。本书根据Python专家Mark Lutz的著名培训课程编写而成,是易于掌握和自学的Python教程。
 本书每一章都对Python语言的关键内容做单独讲解,并且配有章后习题、编程练习及详尽的解答,还配有大量注释的示例以及图表,便于你学习新的技能并巩固加深自己的理解。第5版基于Python2.7和3.3版本,同时也适用于其他Python版本。无论你是编程新手还是其他编程语言的资深开发者,本书都会是你学习Python的理想选择。


本书主要内容
 学习Python的主要内置对象类型,如数字、列表和字典。
 使用Python语句创建和处理对象,并学习Python的通用语法模型。
 使用函数减少代码冗余,使用包代码结构实现代码重用
 学习Python模块:封装语句、函数以及其他工具,以便构建较大的组件
 学习类,即Python用于组织代码的面向对象编程工具
 使用Python的异常处理模型和开发工具编写大型程序
 学习高级Python工具,包括装饰器、描述符、元类和Unicode处理等


“对于那些想要开始使用Python编程的朋友,本书是我所推荐图书中的首选。”
——Doug Hellmann
Racemi公司高级软件工程师

Mark Lutz是一位世界级的Python培训讲师。他是Python畅销书籍的作者,同时从1992年起就成为Python社区的引领者。Mark有着30余年的软件开发经验,也是《Python编程》《Python袖珍指南》等书的作者。

作者简介

[美]马克·卢茨(Mark Lutz)著:Mark Lutz是一位世界级的Python培训讲师。他是Python畅销书籍的作者,同时从1992年起就成为Python社区的引领者。Mark有着30余年的软件开发经验,也是《Python编程》《Python袖珍指南》等书的作者。


译者序

如果你想在2018 年制定一个“学习编程”的年度计划,那么我们会首先推荐Python 这门编程语言。根据目前全球最大的开源代码仓库网站GitHub 提供的数据,在2017 年全球各地的程序员向GitHub 网站发起了约100 万次Python 代码的提交。按照这一指标,Python 无疑是目前世界范围内排名第二的编程语言。而放眼当今的IT 界,Python 自己也像无数励志故事的主角一样,不断成长壮大,并从一众编程语言中脱颖而出,在人工智能、大数据分析、科学计算、大型网站服务搭建等领域大放异彩。
而这本《Python 学习手册》,正是帮助你入门Python 或是进阶学习的优质资源。当前市面上Python 学习的书籍资源非常丰富,相比之下本书有两个主要特点:一是,本书以目前更主流的Python 3.X 系列为主,同时兼顾到Python 2.X 的内容,而不是只停留在2.X的范畴;二是,本书不贪多,并不企图对所有Python 的类库都浅尝辄止,而是专注地把Python 语言的核心知识讲解透彻。正因如此,本书适合作为学习Python 的第一本入门书,同时也可用作强化Python 核心编程的进阶读物。读者可以放心地用本书构筑起稳固的Python 核心基础,在此之上,再选购其他书籍,深入学习Python 在其他特定领域的应用。
当然,这本书的篇幅也十分浩大,难免令人心生畏惧。你也许会有这两个疑惑:Python核心编程知识真的需要这么多篇幅来讲述吗?作者除了讲解Python,是不是也聊了些其他内容?
确实,如果只是列举Python 语法和库函数,那么估计几十页的一本小册子就能胜任,但是如果要帮助读者真正理解和掌握,就不能跳过知识点背后的原理、思想和例子。在翻译本书的过程中,译者能够真切地体会到作者Mark Lutz 先生的耐心与细致。作者孜孜不倦地将许多Python 中看似高深的主题掰开揉碎,娓娓道来。对于几乎每一个知识,都会以知识点、思想、示例代码的方式详细展开。一方面,读者可以自行选择略读一些段落;另一方面,这样的讲解对于理清复杂的知识非常有益。
诚然,本书确实聊了一些其他的内容,例如,在第二部分和第五部分,深入到Python 解释器的层面来讲程序运行和包导入;在第四部分,从软件工程中程序设计的角度来讲函数的编写;在第六部分,结合设计模式的思想来讲Python 中类的编写等。可以说,作者不满足于让读者会写Python,而是希望读者能写得“优雅”,做到熟练应用Python 中的最佳实践。
再聊聊如何阅读本书。面对这样一本“大部头”,译者自己的第一感觉是要将它作为工具书以供查阅。但诚如作者在前言中所说,本书更适合作为教材,更值得从头到尾按章节顺序翻阅学习一遍。不过,如果读者确实已经熟悉Python,则可以通过目录来判断某一章节是否需要跳过,并直接尝试去做跳过章节的“本章习题”。本书附录D 给出了各章及各部分的习题答案。同时,每一部分的最后一章都用一节来专门总结该章“陷阱”,直接阅读“陷阱”节能够帮助读者快速地补齐很多“知识漏洞”。不过,对于不熟悉的章节,还是建议读者完整阅读。值得一提的是,书中代码的注释部分本身就带有解释性。因此,我们希望有能力的读者仔细阅读代码的英文注释,从而加深对代码和概念的理解。
从内容上来说,本书前五部分(上半册)主要介绍了:语言概览(第一部分)、核心类型及操作(第二部分)、语句和语法(第三部分)、函数和生成器(第四部分)、模块和包(第五部分)。这五部分交代了Python 语言的基础,其中的翔实讲解非常适合初学者系统学习,以及进阶者查缺补漏。本书后四部分(下半册)主要介绍了:类和面向对象(第六部分)、异常(第七部分)、高级主题(第八部分)。对于通常的Python 编程,阅读到第七部分基本能够胜任。第八部分可以作为选读部分,在读者遇到相应问题的时候,再做针对性的补充学习。
本书注释部分包含原书注和译注两部分。其中译注部分,旨在帮助读者更好地理解原书的意图。第5 版的整体翻译风格轻松活泼,保持了英文原书原汁原味的风趣幽默。同时,相较本书之前的中文版,我们也做了大量翻译上的调整,从而方便读者阅读。
在所有翻译决定的背后,是对基本概念讲述的仔细推敲。翻译团队内部频繁而密切的交流,加之与原书作者持续的沟通,我们力求保证翻译的质量。当然,最终成书中也不免会有纰漏,希望读者能够包容,并不吝斧正。如果有任何勘误信息或意见建议,或者希望与译者交流,请联系邮箱LearningPython5EChineseBook@outlook.com 或者GitHub 仓库qinacme/Learning-Python-5E-Chinese-Book。衷心希望各位读者能够尽情享受阅读和学习Python 的快乐,并把这份热爱带往今后的编程和生活中。
感谢林涵菲和陈英教授对本书细致的审校。感谢龚靖渝、陈灵健在本书翻译过程中提供的帮助。

译者
2018 年9 月

图书目录

上册
前言 ...............................................................................1
第一部分 使用入门
第1章 问答环节 ............................................................ 21
人们为何使用Python .............................................................................................21
软件质量 ........................................................................................................22
开发者效率.....................................................................................................23
Python是一门“脚本语言”吗 ..............................................................................23
好吧,Python的缺点是什么 ..................................................................................25
如今谁在使用Python .............................................................................................25
其他的Python设计权衡:一些难以把握的方面 ............................................26
使用Python可以做些什么 ......................................................................................28
系统编程 ........................................................................................................28
图形用户界面(GUI) ...................................................................................29
Internet脚本 ....................................................................................................29
组件集成 ........................................................................................................30
数据库编程.....................................................................................................30
快速原型 ........................................................................................................31
数值计算和科学计算编程 ..............................................................................31
更多内容:游戏、图像、数据挖掘、机器人、Excel等 ................................31
Python如何开发并获得支持 ..................................................................................32
开源的权衡.....................................................................................................33
Python有哪些技术上的优点 ..................................................................................33
面向对象和函数式 .........................................................................................33
免费 ................................................................................................................34
可移植 ............................................................................................................34
功能强大 ........................................................................................................35
可混合 ............................................................................................................36
相对简单易用 .................................................................................................36
相对简单易学 .................................................................................................37
以Monty Python命名 ......................................................................................37
Python和其他语言比较起来怎么样 .......................................................................38
本章小结 ...............................................................................................................39
本章习题 ...............................................................................................................39
习题解答 ...............................................................................................................40
Python是工程,不是艺术 ..............................................................................41
第2章 Python如何运行程序 ........................................... 43
Python解释器简介 .................................................................................................43
程序执行 ...............................................................................................................45
程序员的视角 .................................................................................................45
Python的视角 .................................................................................................46
执行模型的变体 ....................................................................................................48
Python的各种实现 .........................................................................................49
执行优化工具 .................................................................................................52
冻结二进制文件 .............................................................................................53
未来的可能性 .................................................................................................54
本章小结 ....................................................................................................55
本章习题 ....................................................................................................55
习题解答 .........................................................................................................56
第3章 你应如何运行程序 ............................................... 57
交互式命令行模式 .................................................................................................57
开始一个交互式会话 ......................................................................................57
Windows平台上的交互式命令行在哪里 ........................................................59
系统路径 ........................................................................................................59
Python 3.3中的新Windows选项:PATH和启动器 ..........................................60
运行的位置:代码目录 ..................................................................................61
不需要输入的内容:提示符和注释 ...............................................................62
交互式地运行代码 .........................................................................................63
为什么要使用交互式命令行模式 ...................................................................64
使用注意:交互命令行模式 ..........................................................................65
系统命令行和文件 .................................................................................................67
第一段脚本.....................................................................................................68
使用命令行运行文件 ......................................................................................69
不同的命令行使用方式 ..................................................................................70
使用注意:命令行和文件 ..............................................................................71
UNIX风格可执行脚本:#! ....................................................................................72
UNIX脚本基础 ...............................................................................................72
UNIX env查找技巧 ........................................................................................73
Python 3.3 Windows启动器:Windows也有#!了 ...........................................73
点击文件图标 ....................................................................................................75
图标点击基础知识 .........................................................................................75
在Windows上点击图标 ..................................................................................76
Windows上输入的技巧 ..................................................................................77
其他图标点击的限制 ......................................................................................79
模块导入和重载 ....................................................................................................79
导入和重载基础知识 ......................................................................................80
模块的宏观视角:属性 ..................................................................................82
使用注意:import和reload .............................................................................85
使用exec运行模块文件 ........................................................................................85
IDLE用户界面 ................................................................................................86
IDLE启动细节 ................................................................................................87
IDLE基础用法 ................................................................................................88
IDLE功能特性 ................................................................................................89
高级IDLE工具 ................................................................................................90
使用注意:IDLE ............................................................................................90
其他IDE ............................................................................................92
其他启动选项 ..................................................................................................93
嵌入式调用.....................................................................................................93
冻结二进制可执行文件 ..................................................................................94
文本编辑器启动方式 ......................................................................................94
其他的启动方式 .............................................................................................95
未来的可能.....................................................................................................95
应该选用哪种方式 .................................................................................................95
调试Python代码 .............................................................................................96
本章小结 ....................................................................................................97
本章习题 ..................................................................................................97
习题解答 .......................................................................................................98
第一部分练习题 ....................................................................................................99
第二部分 类型和运算
第4章 介绍Python对象类型 ......................................... 105
Python知识结构 .................................................................................................105
为什么要使用内置类型 .......................................................................................106
Python核心数据类型 ...........................................................................................107
数字 ......................................................................................108
字符串 ........................................................................................ 110
序列操作 ...................................................................................................... 110
不可变性 ...................................................................................................... 112
特定类型的方法 ........................................................................................... 113
寻求帮助 ...................................................................................................... 115
字符串编程的其他方式 ................................................................................ 116
Unicode字符串 ............................................................................................ 117
模式匹配 ...................................................................................................... 119
列表 ...........................................................................120
序列操作 ......................................................................................................120
特定的操作...................................................................................................121
边界检查 ......................................................................................................121
嵌套 ..............................................................................................................122
推导 ..............................................................................................................122
字典 .....................................................................................125
映射操作 ......................................................................................................125
重访嵌套 ......................................................................................................126
不存在的键:if 测试 ....................................................................................128
键的排序:for 循环 ......................................................................................129
迭代和优化...................................................................................................131
元组 ................................................................................132
为什么要使用元组 .......................................................................................133
文件 ....................................................................................133
二进制字节文件 ...........................................................................................134
Unicode文本文件 .........................................................................................135
其他类文件工具 ...........................................................................................137
其他核心类型 .................................................................................................137
如何破坏代码的灵活性 ................................................................................139
用户定义的类 ...............................................................................................140
剩余的内容...................................................................................................141
本章小结 .......................................................................................................141
本章习题 .......................................................................................................141
习题解答 .......................................................................................................142
第5章 数值类型 .......................................................... 143
数值类型基础知识 ...............................................................................................143
数值字面量...................................................................................................144
内置数值工具 ...............................................................................................146
Python表达式运算符 ....................................................................................146
数字的实际应用 ..................................................................................................151
变量与基础表达式 .......................................................................................151
数值的显示格式 ...........................................................................................153
str和repr显示格式 ........................................................................................154
普通比较与链式比较 ....................................................................................154
除法:经典除法、向下取整除法和真除法 ..................................................156
整数精度 ......................................................................................................160
复数 ...........................................................................................................160
十六进制、八进制和二进制:字面量与转换 ..............................................161
按位操作 ......................................................................................................163
其他内置数值工具 .......................................................................................164
其他数值类型 ....................................................................................................167
小数类型 ......................................................................................................167
分数类型 ......................................................................................................169
集合 ...........................................................................................................173
布尔型 ..........................................................................................................180
数值扩展 ........................................................................................................181
本章小结 ........................................................................................................182
本章习题 ........................................................................................................182
习题解答 .........................................................................................................182
第6章 动态类型 .......................................................... 184
缺少声明语句的情况 ...........................................................................................184
变量、对象和引用 .......................................................................................184
类型属于对象,而不是变量 ........................................................................186
对象的垃圾收集 ...........................................................................................187
关于Python垃圾回收的更多讨论 .................................................................188
共享引用 ......................................................................................................189
共享引用和在原位置修改 ............................................................................190
共享引用和相等 ...........................................................................................192
动态类型随处可见 ...............................................................................................193
“弱”引用...................................................................................................194
本章小结 ......................................................................................................194
本章习题 .......................................................................................................194
习题解答 .......................................................................................................195
第7章 字符串基础 ....................................................... 196
本章范围 .............................................................................................................196
Unicode简介 .................................................................................................197
字符串基础 ..........................................................................................................197
字符串字面量 ......................................................................................................199
单引号和双引号字符串是一样的 .................................................................200
转义序列代表特殊字符 ................................................................................200
原始字符串阻止转义 ....................................................................................203
三引号编写多行块字符串 ............................................................................205
实际应用中的字符串 ...........................................................................................206
基本操作 ......................................................................................................206
索引和分片...................................................................................................207
请留意:分片 ............................................................................................... 211
字符串转换工具 ...........................................................................................212
修改字符串I .................................................................................................214
字符串方法 ..........................................................................................................216
方法调用语法 ...............................................................................................216
字符串的方法 ...............................................................................................217
字符串方法示例:修改字符串II ..................................................................218
字符串方法示例:解析文本 ........................................................................220
实际应用中的其他常见字符串方法 .............................................................220
原始string模块的函数(在Python 3.X中删除) ..........................................221
字符串格式化表达式 ...........................................................................................223
格式化表达式基础 .......................................................................................224
高级格式化表达式语法 ................................................................................225
高级格式化表达式举例 ................................................................................226
基于字典的格式化表达式 ............................................................................227
字符串格式化方法调用 .......................................................................................228
字符串格式化方法基础 ................................................................................228
添加键、属性和偏移量 ................................................................................229
高级格式化方法语法 ....................................................................................230
高级格式化方法举例 ....................................................................................231
与%格式化表达式比较.................................................................................233
为什么使用格式化方法 ................................................................................236
通用类型分类 ......................................................................................................241
同一分类中的类型共享同一个操作集..........................................................241
可变类型能够在原位置修改 ........................................................................242
本章小结 .............................................................................................................242
本章习题 .............................................................................................................243
习题解答 .............................................................................................................243
第8章 列表与字典 ....................................................... 245
列表 .........................................................................................245
列表的实际应用 ..................................................................................................248
基本列表操作 ...............................................................................................248
列表迭代和推导 ...........................................................................................248
索引、分片和矩阵 .......................................................................................249
原位置修改列表 ...........................................................................................250
字典 ...................................................................................................256
字典的实际应用 ..................................................................................................258
字典的基本操作 ...........................................................................................258
原位置修改字典 ...........................................................................................259
其他字典方法 ...............................................................................................260
示例:电影数据库 .......................................................................................262
字典用法注意事项 .......................................................................................263
创建字典的其他方式 ....................................................................................267
请留意:字典vs列表 ....................................................................................268
Python 3.X和2.7中的字典变化 .....................................................................269
请留意:字典接口 .......................................................................................276
本章小结 .............................................................................................................277
本章习题 .............................................................................................................277
习题解答 .............................................................................................................277
第9章 元组、文件与其他核心类型 ............................... 279
元组 .................................................................................280
元组的实际应用 ...........................................................................................281
为什么有了列表还要元组 ............................................................................283
重访记录:有名元组 ....................................................................................284
文件 ..............................................................................................286
打开文件 ......................................................................................................287
使用文件 ......................................................................................................288
文件的实际应用 ...........................................................................................289
文本和二进制文件:一个简要的故事..........................................................290
在文件中存储Python对象:转换 .................................................................291
存储Python原生对象:pickle .......................................................................293
用JSON格式存储Python对象 .......................................................................294
存储打包二进制数据:struct .......................................................................296
文件上下文管理器 .......................................................................................297
其他文件工具 ...............................................................................................297
核心类型复习与总结 ...........................................................................................299
请留意:运算符重载 ....................................................................................300
对象灵活性...................................................................................................300
引用vs复制 ...................................................................................................301
比较、等价性和真值 ....................................................................................303
Python中True和False的含义 ........................................................................307
Python的类型层次 ........................................................................................309
类型的对象...................................................................................................309
Python中的其他类型 .................................................................................... 311
内置类型陷阱 ...................................................................................................... 311
赋值创建引用,而不是复制 ........................................................................ 311
重复会增加层次深度 ....................................................................................312
注意循环数据结构 .......................................................................................313
不可变类型不可以在原位置改变 .................................................................313
本章小结 ........................................................................................................314
本章习题 ........................................................................................................314
习题解答 ........................................................................................................315
第二部分练习题 ..................................................................................................315
第三部分 语句和语法
第10章 Python语句简介.............................................. 321
重温Python的知识结构 .......................................................................................321
Python的语句 ......................................................................................................322
两种不同的if .......................................................................................................324
Python增加的元素 ........................................................................................325
Python删除的元素 ........................................................................................325
为什么采用缩进语法 ....................................................................................327
几种特殊情况 ...............................................................................................329
简短示例:交互式循环 .......................................................................................331
一个简单的交互式循环 ................................................................................331
对用户输入做数学运算 ................................................................................333
通过测试输入数据来处理错误 .....................................................................334
用try语句处理错误 .......................................................................................335
嵌套三层深的代码 .......................................................................................337
本章小结 .........................................................................................................338
本章习题 .........................................................................................................338
习题解答 .........................................................................................................338
第11章 赋值、表达式和打印 ....................................... 340
赋值语句 .........................................................................................................340
赋值语句形式 ...............................................................................................341
序列赋值 ......................................................................................................342
Python 3.X中的扩展序列解包 ......................................................................345
多目标赋值...................................................................................................349
增量赋值 ......................................................................................................350
变量命名规则 ...............................................................................................353
Python中的废弃协议 ....................................................................................355
表达式语句 ..........................................................................................................356
表达式语句和原位置修改 ............................................................................358
打印操作 .............................................................................................................358
Python 3.X的print函数 .................................................................................359
Python 2.X的print语句 .................................................................................362
打印流重定向 ...............................................................................................363
版本中立的打印 ...........................................................................................367
为什么你要注意:print和stdout ...................................................................369
本章小结 ......................................................................................................370
本章习题 .......................................................................................................370
习题解答 .......................................................................................................370
第12章 if测试和语法规则 ............................................ 372
if语句...............................................................................................372
一般形式 ......................................................................................................372
基础示例 ......................................................................................................373
多路分支 ......................................................................................................373
复习Python语法规则 ...........................................................................................375
代码块分隔符:缩进规则 ............................................................................377
语句分隔符:行与行间连接符 .....................................................................378
一些特殊情况 ...............................................................................................379
真值和布尔测试 ..................................................................................................381
if/else三元表达式 ................................................................................................383
请留意:布尔值 ...........................................................................................384
本章小结 .............................................................................................................386
本章习题 .............................................................................................................386
习题解答 .............................................................................................................386
第13章 while循环和for循环 ......................................... 387
while循环 ............................................................................................................387
一般形式 ......................................................................................................387
示例 ..............................................................................................................388
break、continue、pass和循环的else ....................................................................389
一般循环形式 ...............................................................................................389
pass ...............................................................................................................389
continue ........................................................................................................391
break .............................................................................................................391
循环的else ....................................................................................................392
请留意:仿真C 语言的while循环 ................................................................393
for循环 .......................................................................................................394
一般形式 ......................................................................................................394
示例 ..............................................................................................................395
请留意:文件扫描器 ....................................................................................400
编写循环的技巧 ..................................................................................................402
计数器循环:range ......................................................................................402
序列扫描:while和range vs for ....................................................................403
序列乱序器:range和len ..............................................................................404
非穷尽遍历:range vs分片 ..........................................................................405
修改列表:range vs推导 ..............................................................................406
并行遍历:zip和map ....................................................................................407
同时给出偏移量和元素:enumerate ............................................................410
请留意:shell命令及其他 ............................................................................ 411
本章小结 ........................................................................................................414
本章习题 ........................................................................................................414
习题解答 .......................................................................................................414
第14章 迭代和推导 ..................................................... 416
迭代器:初次探索 ...............................................................................................417
迭代协议:文件迭代器 ................................................................................417
手动迭代:iter和next ...................................................................................420
其他内置类型可迭代对象 ............................................................................423
列表推导:初次深入探索 ...................................................................................425
列表推导基础 ...............................................................................................426
在文件上使用列表推导 ................................................................................427
扩展的列表推导语法 ....................................................................................428
其他迭代上下文 ..................................................................................................430
Python 3.X新增的可迭代对象 .............................................................................435
对Python 2.X版本代码的影响:利与弊 .......................................................435
range可迭代对象 ..........................................................................................436
map、zip和filter可迭代对象 ........................................................................437
多遍迭代器vs单遍迭代器 ............................................................................439
字典视图可迭代对象 ....................................................................................440
其他迭代话题 ......................................................................................................441
本章小结 .............................................................................................................442
本章习题 .............................................................................................................442
习题解答 .............................................................................................................442
第15章 文档 ............................................................... 444
Python文档资源 ...................................................................................................444
#注释 ............................................................................................................445
dir函数 .........................................................................................................445
文档字符串:__doc__ ............................................................................................447
PyDoc:help函数 .........................................................................................450
PyDoc:HTML报告 .....................................................................................453
改变PyDoc的颜色 ........................................................................................456
超越文档字符串:Sphinx ............................................................................461
标准手册集...................................................................................................462
网络资源 ......................................................................................................463
已出版的书籍 ...............................................................................................463
常见代码编写陷阱 ...............................................................................................463
本章小结 .........................................................................................................465
本章习题 .........................................................................................................466
习题解答 .........................................................................................................466
第三部分练习题 .................................................................................................467
第四部分 函数和生成器
第16章 函数基础 ........................................................ 473
为何使用函数 ...................................................................................................474
编写函数 ...................................................................................................475
def语句 .........................................................................................................476
def语句执行于运行时 ..................................................................................477
第一个示例:定义和调用 ...................................................................................478
定义 ..............................................................................................................478
调用 ..............................................................................................................478
Python中的多态 ...........................................................................................479
第二个示例:寻找序列的交集 ............................................................................480
定义 ..............................................................................................................480
调用 ..............................................................................................................481
重访多态 ......................................................................................................482
局部变量 ......................................................................................................482
本章小结 .........................................................................................................483
本章习题 .........................................................................................................483
习题解答 .........................................................................................................483
第17章 作用域 ............................................................ 485
Python作用域基础 ...............................................................................................485
作用域细节...................................................................................................486
变量名解析:LEGB规则 .............................................................................488
作用域实例...................................................................................................490
内置作用域...................................................................................................491
打破Python 2.X的小宇宙 .............................................................................494
global语句 ......................................................................................................494
程序设计:最少化全局变量 ........................................................................495
程序设计:最小化跨文件的修改 .................................................................497
其他访问全局变量的方式 ............................................................................498
作用域和嵌套函数 ...............................................................................................499
嵌套作用域的细节 .......................................................................................500
嵌套作用域举例 ...........................................................................................500
工厂函数:闭包 ...........................................................................................501
使用默认值参数来保存外层作用域的状态 ..................................................503
Python 3.X中的nonlocal语句 ...............................................................................507
nonlocal基础 ................................................................................................508
nonlocal应用 ................................................................................................509
为什么选nonlocal?状态保持备选项 .................................................................. 511
nonlocal变量的状态:仅适用于Python 3.X ................................................. 511
全局变量的状态:只有一份副本 .................................................................512
类的状态:显式属性(预习) .....................................................................513
函数属性的状态:Python 3.X和Python 2.X的异同 .....................................514
请留意:定制open .......................................................................................516
本章小结 .............................................................................................................518
本章习题 .............................................................................................................518
习题解答 .............................................................................................................520
第18章 参数 ............................................................... 521
参数传递基础 ......................................................................................................521
参数和共享引用 ...........................................................................................522
避免修改可变参数 .......................................................................................524
模拟输出参数和多重结果 ............................................................................525
特殊的参数匹配模式 ...........................................................................................526
参数匹配基础 ...............................................................................................526
参数匹配语法 ...............................................................................................527
更深入的细节 ...............................................................................................528
关键字参数和默认值参数的示例 .................................................................529
可变长参数的实例 .......................................................................................532
Python 3.X的keyword-only参数 ...................................................................536
min提神小例 ........................................................................................................539
满分 ..............................................................................................................540
附加分 ..........................................................................................................541
结论 ..............................................................................................................542
通用set函数 .........................................................................................................542
模拟Python 3.X print函数 ....................................................................................544
使用keyword-only参数 .................................................................................546
请留意:关键字参数 ....................................................................................547
本章小结 .............................................................................................................548
本章习题 .............................................................................................................548
习题解答 .............................................................................................................549
第19章 函数的高级话题 .............................................. 550
函数设计概念 ......................................................................................................550
递归函数 .............................................................................................................552
用递归求和...................................................................................................552
编码替代方案 ...............................................................................................553
循环语句vs递归 ...........................................................................................554
处理任意结构 ...............................................................................................555
函数对象:属性和注解 .......................................................................................558
间接函数调用:“一等”对象 .....................................................................559
函数自省 ......................................................................................................560
函数属性 ......................................................................................................561
Python 3.X中的函数注解 .............................................................................562
匿名函数:lambda...............................................................................................564
lambda表达式基础 .......................................................................................564
为什么使用lambda .......................................................................................566
如何(不)让Python代码变得晦涩难懂 ......................................................568
作用域:lambda也能嵌套 ............................................................................569
请留意:lambda回调 ....................................................................................570
函数式编程工具 ..................................................................................................570
在可迭代对象上映射函数:map ..................................................................571
选择可迭代对象中的元素:filter .................................................................573
合并可迭代对象中的元素:reduce ..............................................................573
本章小结 .....................................................................................................575
本章习题 .....................................................................................................575
习题解答 .....................................................................................................575
第20章 推导和生成 ..................................................... 577
列表推导与函数式编程工具 ................................................................................577
列表推导与map ............................................................................................578
使用filter增加测试和循环嵌套 .....................................................................579
示例:列表推导与矩阵 ................................................................................582
不要滥用列表推导:简单胜于复杂(KISS) ..............................................584
请留意:列表推导和map .............................................................................585
生成器函数与表达式 ...........................................................................................587
生成器函数:yield vs return ........................................................................587
生成器表达式:当可迭代对象遇见推导语法 ..............................................592
生成器函数vs生成器表达式 .........................................................................597
生成器是单遍迭代对象 ................................................................................599
Python 3.3的yield from扩展 .........................................................................600
内置类型、工具和类中的值生成 .................................................................601
实例:生成乱序序列 ....................................................................................604
不要过度使用生成器:明确胜于隐晦(EIBTI) ........................................609
示例:用迭代工具模拟zip和map ................................................................. 611
为什么你要注意:单遍迭代 ........................................................................616
推导语法总结 ...................................................................................................617
作用域及推导变量 .......................................................................................617
理解集合推导和字典推导 ............................................................................619
集合与字典的扩展推导语法 ........................................................................620
本章小结 .............................................................................................................621
本章习题 .............................................................................................................621
习题解答 .............................................................................................................621
第21章 基准测试 ........................................................ 623
计时迭代可选方案 ...............................................................................................623
自己编写的计时模块 ....................................................................................624
3.3版本中新的计时器调用 ...........................................................................627
计时脚本 ......................................................................................................628
计时结果 ......................................................................................................630
计时模块可选方案 .......................................................................................633
其他建议 ......................................................................................................636
用timeit为迭代和各种Python计时 .......................................................................637
timeit基础用法 .............................................................................................637
基准测试模块和脚本:timeit .......................................................................641
基准测试脚本结果 .......................................................................................643
基准测试的更多乐趣 ....................................................................................646
其他基准测试主题:pystones .............................................................................650
函数陷阱 .............................................................................................................651
局部变量是被静态检测的 ............................................................................651
默认值参数和可变对象 ................................................................................653
没有return语句的函数 ..................................................................................655
其他函数陷阱 ...............................................................................................655
本章小结 .............................................................................................................656
本章习题 .............................................................................................................656
习题解答 .............................................................................................................656
第四部分练习题 ..................................................................................................657
第五部分 模块和包
第22章 模块:宏伟蓝图 .............................................. 663
为什么使用模块 ..................................................................................................664
Python程序架构 ...................................................................................................664
如何组织一个程序 .......................................................................................665
导入和属性...................................................................................................665
标准库模块...................................................................................................667
import如何工作 ...................................................................................................667
1.搜索 ...........................................................................................................668
2.编译(可选) ............................................................................................668
3.运行 ...........................................................................................................669
字节码文件:Python 3.2及以上版本的__pycache__ ..............................................................670
实际应用中的字节码文件模型 .....................................................................671
模块搜索路径 ......................................................................................................672
配置搜索路径 ...............................................................................................674
搜索路径的变化 ...........................................................................................674
sys.path列表 .................................................................................................675
模块文件选择 ...............................................................................................676
第三方工具:distutils ..................................................................................678
本章小结 .............................................................................................................678
本章习题 .............................................................................................................679
习题解答 .............................................................................................................679
第23章 模块代码编写基础 ........................................... 680
模块的创建 ..........................................................................................................680
模块文件名...................................................................................................680
其他种类的模块 ...........................................................................................681
模块的使用 ..........................................................................................................681
import语句 ...................................................................................................681
from语句 ......................................................................................................682
from *语句 ...................................................................................................682
导入只发生一次 ...........................................................................................683
import和from是赋值语句 .............................................................................684
import和from的等价性 .................................................................................685
from语句潜在的陷阱 ....................................................................................686
模块命名空间 ......................................................................................................687
文件产生命名空间 .......................................................................................687
命名空间字典:__dict__ ............................................................................689
属性名称的点号运算 ....................................................................................689
导入与作用域 ...............................................................................................690
命名空间的嵌套 ...........................................................................................691
重新加载模块 ......................................................................................................692
reload基础 ....................................................................................................693
reload示例 ....................................................................................................694
请留意:模块重新加载 ................................................................................695
本章小结 .............................................................................................................696
本章习题 .............................................................................................................696
习题解答 .............................................................................................................696
第24章 模块包 ............................................................ 698
包导入基础 ...................................................................................................698
包和搜索路径设置 .......................................................................................699
__init__.py包文件 .........................................................................................700
包导入示例 .....................................................................................................702
包的from语句与包的import语句 ..................................................................703
为什么要使用包导入 ...........................................................................................704
三个系统的故事 ...........................................................................................705
请留意:模块包 ...........................................................................................707
包相对导入 .....................................................................................................708
Python 3.X中的变化 .....................................................................................708
相对导入基础知识 .......................................................................................709
为什么使用相对导入 ....................................................................................710
相对导入的适用情况 ....................................................................................713
模块查找规则总结 .......................................................................................713
相对导入的实际应用 ....................................................................................714
包相对导入的陷阱:混合使用 .....................................................................719
Python 3.3中的命名空间包 ..................................................................................724
命名空间包的语义 .......................................................................................725
对常规包的影响:可选的__init__.py ............................................................726
命名空间包的实际应用 ................................................................................727
命名空间包嵌套 ...........................................................................................729
文件仍然优先于路径 ...................................................................................730
本章小结 .............................................................................................................732
本章习题 .............................................................................................................732
习题解答 .............................................................................................................733
第25章 高级模块话题 .................................................. 734
模块设计概念 .................................................................................................734
模块中的数据隐藏 ...............................................................................................736
使 * 的破坏最小化:_X和__all__ .................................................................736
启用未来语言特性:__future__ ....................................................................................737
混合使用模式:__name__和__main__ ................................................................................738
以__name__进行单元测试 ............................................................................739
示例:双模式代码 ...............................................................................................740
货币符号:Unicode的应用 ..........................................................................743
文档字符串:模块文档的应用 .....................................................................745
修改模块搜索路径 ...............................................................................................746
import语句和from语句的as扩展 ..........................................................................747
示例:模块即是对象 ...........................................................................................748
用名称字符串导入模块 .......................................................................................750
运行代码字符串 ...........................................................................................751
直接调用:两种方式 ....................................................................................751
示例:传递性模块重载译注1 ..................................................................................... 752
递归重载器...................................................................................................752
另外的代码...................................................................................................756
模块陷阱 ....................................................................................................759
模块名称冲突:包和包相对导入 .................................................................760
顶层代码中语句次序很重要 ........................................................................760
from复制名称,而不是链接 ........................................................................761
from *会让变量含义模糊化 .........................................................................762
reload不能作用于from导入 ..........................................................................762
reload、from以及交互式测试 ......................................................................763
递归形式的from导入可能无法工作 .............................................................764
本章小结 .....................................................................................................765
本章习题 .......................................................................................................766
习题解答 .....................................................................................................766
第五部分练习题 ..................................................................................................766

教学资源推荐
作者: 雷大正 王啸楠 丁德成 等编著  岳丽华 主审
作者: [美] 罗伯特·塞奇威克(Robert Sedgewick) 凯文·韦恩(Kevin Wayne) 罗伯特·唐德罗(Robert Dondero) 著
作者: (美)Harold Abelson,Gerald Jay Sussman,Julie Sussman