本书是学习Python编程语言的入门书籍。Python是一种很流行的开源编程语言,可以在各种领域中用于编写独立的程序和脚本。Python免费、可移植、功能强大,而且使用起来相当容易。来自软件产业各个角落的程序员都已经发现,Python对于开发者效率和软件质量的关注,这无论在大项目还是小项目中都是一个战略性的优点。
无论你是编程初学者,还是专业开发人员,本书的目标是让你快速掌握核心Python语言基础。阅读本书后,你会对Python有足够的了解,能够将其应用于所从事的领域中。
本书设计成一本教程,主要关注核心Python语言本身,而不是其特定的应用程序。因此,它作为一个两卷本的合集中的第一本:
《Learning Python》,也就是这本书,介绍Python本身。
《Programming Python》,另外一本书,介绍在学习了Python之后可以用它来做什么。
也就是说,《Programming Python》这本基于应用的图书选择了本书所省略的话题,介绍了Python在Web、图形用户界面(GUI)和数据库这样的常用领域的作用。此外,《Python Pocket Reference》一书提供了本书所没有的额外参考资料,可将它作为本书的补充。
划之初就力求向读者展示比众多程序员初次学习这门语言的时候更深层次的话题。并且,本书基于一个带有测试和练习的3天的Python培训课程,所以可以作为该语言的一个自学教程。
关于第4版
本书第4版从以下3个方面做出了修改:
覆盖了Python 3.0和Python 2.6,本书强调Python 3.0,但是对Python 2.6中的不同之处给出了提示。
包含了一些新的章节,主要介绍高级的核心语言话题。
重新组织了一些已有的材料,并且使用新的示例扩展它们以便更清楚。
我在2009年撰写本书这一版时,Python分为两支——Python 3.0是新兴的版本并且不兼容地修改了该语言;Python 2.6保持与大量已有的Python代码向后兼容。尽管Python 3被视作是Python的未来,Python 2仍然使用广泛并且会在未来的几年内与Python 3并列地得到支持。 尽管只是同一种语言的不同版本,但Python 3.0几乎无法运行为之前版本编写的代码(单单print从语句修改为函数,听上去更合理,但是,它几乎影响到所有已经编写好的Python程序)。
版本的划分使得程序员和图书作者都陷入了两难的境地。尽管编写一本好像Python 2不存在而只介绍Python 3的图书很容易,但这可能无法满足大量基于已有代码的Python用户的需求。大量已有代码都是针对Python 2编写的,并且它们不会很快过时。尽管现在的初学者更关注Python 3,但如果他们必须使用过去编写的代码,那么就必须熟悉Python 2。所有的第三方库和扩展都移植到Python 3可能还需要数年时间,所以Python 2这一分支可能不完全是临时性的。
覆盖Python 3.0和Python 2.6
为了解决这一分歧并且满足所有潜在读者的需求,本书的这一版更新为覆盖Python 3.0和Python 2.6(以及Python 3.X和Python 2.X系列的后续发布)。本书针对使用Python 2编程的程序员、使用Python 3的程序员,以及介于这二者之间的程序员。
也就是说,你可以使用本书来学习任何的Python版本。尽管这里主要关注Python 3.0,但Python 2.6的不同之处和工具也都针对使用旧代码的程序员给出了提示。尽管这两个版本大部分是相同的,但它们还是在一些重要的方面有所不同,对此我将指出两者的区别。
例如,在大多数示例中,我们使用Python 3.0的print调用,但是,我也将介绍Python 2.6的print语句,以便使你能够理解较早的代码。我还广泛地介绍了新功能,例如Python 3.0中的nonlocal语句和Python 2.6以及Python 3.0中的字符串的format方法,当较早的Python中没有这样的扩展时,我将会指出来。
如果你初次学习Python并且不需要使用任何遗留代码,我鼓励你从Python 3.0开始,它清理了这一语言中长久以来的一些瑕疵,同时保留了所有最初的核心思想并且添加了一些漂亮的新工具。
当你阅读本书时,很多流行的Python库和工具可能也支持Python 3.0了,特别是在未来的Python 3.1版本中,可以预期文件I/O性能会有较大的提升。如果你使用基于Python 2.X的一个系统,将会发现本书解决了你所关心的问题,并且将帮助你在未来过渡到Python 3.0。
. 此外,本版也介绍了其他的Python 2和Python 3的发布版本,尽管一些旧的Python 2.X代码可能无法运行本书的所有示例。例如,尽管在Python 2.6和Python 3.0中都有类装饰器,但我们无法在还没有这一功能的旧Python 2.X中使用它。参见前言中的表0-1和表0-2,它们概括了Python 2.6和Python 3.0中的变化。
注意: 就在付梓前不久,本书中还添加了关于未来的Python 3.1版的一些突出的扩展的提示,如:字符串format方法调用中的逗号分隔符和自动字段编号、with语句中的多环境管理器语法、针对数字的新方法等。由于Python 3.1的主要目标是优化,本书也直接应用这一新发布。事实上,由于Python 3.1在Python 3.0后接踵而来,并且最新的Python通常是最好的可用Python,在本书中,术语“Python 3.0”通常指的是Python 3.0引入的但在整个Python 3.X版本中都将存在的语言变化。
新增章
尽管本版的主要目标是针对Python 3.0和Python 2.6更新之前的版本的示例和内容,但我们也增加了5章新内容,以介绍新的主题和增加的内容。
第27章是一个新的类教程,使用更加实际的示例来说明Python面向对象编程的基础知识。
第36章提供了关于Unicode和字节字符串的详细介绍,并且概括了Python 2.6和Python 3.0中字符串和文件的区别。
第37章介绍了特性这样的管理属性工具,并且对描述符给出了新的介绍。
第38章介绍了函数和类装饰器,并且给出了全面的示例。
第39章介绍了元类,并且将它们与描述符进行了比较和对比。
第27章针对Python中的类和OOP提供了一个渐进的、按部就班的教程。它基于我在近年所教授的培训课程中已经使用的一个现场展示,但是,为了在本书中使用已经对它进行了修改。该章设计来在比此前的示例更为实际的背景中展示OOP,并且说明类概念如何综合运用于较大的、实用的程序中。我期望它在这里与在实际的课程中一样有效。
后面新增的4章收录到了本书的最后一个新增部分中,即“高级话题”部分。尽管这些主题从技术上讲都属于核心语言,但不是每个Python程序员都需要深入了解Unicode文本或元类的细节。因此,这4章单独放到了新的部分中,并且正式地作为可选的阅读材料。例如,关于Unicode和二进制数据字符串的细节已经放入到了此部分中,因为大多数程序员使用简单的ASCII字符串,而不需要了解这些主题。类似地,装饰器和元类通常也只是API构建者才感兴趣的专门话题,而不是应用程序员所感兴趣的话题。
然而,如果你确实使用这些工具,或者使用代码来做这些工作,“高级话题”部分的章节应该能够帮助你掌握其基础知识。此外,这些章的示例包含了学习案例,这些案例把核心语言概念绑定到了一起,并且它们比本书其他部分的示例更充实。由于这个新的部分是可选阅读材料,所以该部分最后只有问答题但没有练习题。
已有内容的修改
此外,之前版本的一些内容已经重新组织了,或者用新的示例进行了补充。例如多继承,在第30章增加了列出类树的一个新的学习示例;第20章增加了手动实现map和zip的生成器的示例;第31章新增的代码说明了静态方法和类方法;第23章介绍了包相对导入;第29章的示例介绍了_contains_、_bool_和_index_运算符重载方法,以及针对分片和比较的新的重载协议。
本版还进行了一些结构上的调整以便更清晰。例如,为了融入新的内容和主题,并且为了避免各章主题的重叠,将前5章划分为两部分。这样一来关于运算符重载、作用域和参数、异常语句细节,以及解析和迭代主题就都有了新的独立的章。已有的章内部也进行了一些重新排序,以便更好地介绍主题。
本版还试图通过一些重新排序来减少一些向后引用,尽管Python 3.0的变化使得在某些情况下不可能这么做。要理解打印和字符串格式化方法,现在必须知道针对函数的关键字参数;要理解字典键列表和键测试,现在必须知道迭代;要使用exec来运行代码,需要能够使用文件对象,等等。顺序阅读可能还是最有意义的,但是一些主题可能需要非线性的跳跃和随机查找。
总的来说,本版中有几百处修改。前言的下一个小节,记录下了Python中的27处增加和57处修改。实际上,可以说本版变得更加高级,因为Python多少变得更加高级了。针对Python 3.0自身,你最好能自己发现本书中的修改之处,而不是通过这个前言来了解这些修改。
Python 2.6和Python 3.0中的特定语言扩展
Python 3.0是一种清晰的语言,但是它也是在某些方面更为复杂的一种语言。实际上,它的一些修改似乎假设你必须为了学习Python而已经了解Python。前面的部分概括了Python 3.0中的一些基础知识。随便举个例子,把字典视图包含到一个list调用中的合理性,该问题是难以置信的细微,并且需要实质预测。除了教授Python的基础知识,本书还充当了跨越这些知识鸿沟的桥梁。表0-1列出了本版中介绍的大多数显著的新的语言功能,并且列出了介绍它们的主要的章。
关于本书
本部分强调了本书的一般性重点,和本书的版本无关。没有哪本书可以满足每一位潜在的读者,所以阅读之前了解本书的写作目的是很重要的。
事前准备
事实上,阅读本书确实没有什么绝对的先决条件。初学者和功底深厚的编程高手都可以从容地阅读本书。如果打算学习Python,本书可能很适合你。如果你曾有过编程或编写脚本的经验,那么会对你阅读本书有一点帮助。但是,并不要求每位读者都得这样。
本书设计为程序员注1学习Python的入门书籍。对于那些从来没有接触过计算机的人,可能就不适合了(例如,我不会花时间讨论计算机是什么)。但是,这并不意味你需要有编程的经历。
另一方面,我不会假设读者什么都不懂而冒犯了读者:使用Python来做有意义的事,这很容易,而本书就是要教读者怎样做。本书有时会用Python和C、C++、Java以及Pascal语言来做比较,但是如果读者过去没有使用过这些语言,则完全可以放心地忽略这些比较。
本书的范围和其他书籍
虽然本书涵盖了Python语言所有的基本内容,但基于速度和篇幅的考虑,我还是把本书的范围缩小了。为了让事情简单化,本书关注核心概念,使用小并且独立完备的例子来示范重点知识,并且有时省略了可以在参考手册中找到的细节。因此,把本书当作通往更高级应用的垫脚石和完整的入门书籍再好不过了。
例如,我们不会谈论太多的Python/C集成,这个复杂话题显然是许多基于Python的系统的核心。我们也不会谈论太多Python的历史或发展过程。对于流行的Python应用程序也只简单浏览而已,例如,GUI、系统工具以及网络脚本机制,而有的则根本不提。显然,这会漏掉整体内容的一部分。
从整体上来说,Python是为了让脚本的质量等级再提升几个级别。而Python的有些观念需要的背景环境,不是这里所能提供的,如果没有推荐读者读完此书后进行更深入的学习,那就是我的疏忽了。我希望本书的绝大多数读者最终都可以继续走下去,从其他书籍完整了解应用层面的编程技术。
因为本书关注的是初学者,设计上自然是和O扲eilly的其他Python书籍互补。例如,我编写的另一本书《Programming Python》,提供更大并且更完整的例子,还有应用程序编程技巧的教程,而且我有意将其设计为读完此书后的后续书籍。概括地说,本书的目前版本和《Programming Python》反映了作者培训内容的两部分:核心语言和应用程序程序设计。此外,O扲eilly的《Python Pocket Reference》也是搜索本书忽略的一些细节的快速参考手册。
其他后续的书籍也可提供参考、附加的例子或者于特定领域中(例如,Web开发和GUI)使用Python的细节。例如,O扲eilly的《Python in a Nutshell》以及Sams的《Python Essential Reference》提供了有用的参考,而O扲eilly的《Python Cookbook》则为那些已熟知应用程序设计技巧的人提供了独立完备的例子。因为别人对书籍的评价是很主观的,建议读者亲自浏览这些书,来选择满足自己需求的进阶书籍。不过,无论选择哪本书,要记住,Python其余内容所需学习的例子都相当实际,以至于这里没有空间能够容纳。
尽管这么说,我想读者还是会发现本书是学习Python的首选书籍,虽然范围有限(也许也正是因为如此)。你会学到初学阶段编写独立的Python程序和脚本所需要的一切。当你读完本书时,不仅学习了语言本身,也会学到如何将其合理地运用于日常工作中。此外,当读者遇到更高级的主题和例子时,将会有足够的能力去解决它们。
本书的风格和结构
本书是基于为期3天的Python课程的培训材料编写而成的。每章末尾有本章对应的习题,并且在每部分最后一章末尾有本部分对应的练习题。习题和练习题的解答在附录B中给出。习题可以帮助读者复习学过的内容,而练习题可以帮助读者以正确的方式编写代码,而且这通常也是该课程的重点之一。
强烈建议做一下习题和练习题,不仅是为了积累Python编程的经验,也是因为有些练习题会引出本书没有涉及的主题。如果碰上难题,附录B的解答应该可以帮助你(而且我也鼓励你尽量地阅读那些解答)。
本书的整体结构也是来自于课程的培训材料。因为本书是用来快速介绍语言的基础的,所以以语言的主要功能进行组织并介绍,而不是以例子为主。这里采用了由下至上的手法:从内置对象类型,到语句,再到程序单元等。每章都比较完备,但是后续的章节会利用到前面章节所介绍的概念(例如,谈到类时,我假定你已经知道如何编写函数),所以对多数读者来说,循序渐进应该是最合理的阅读方法。
一般来说,本书用由下至上的方式介绍Python语言,一个部分介绍一种主要语言功能(类型以及函数等),并且多数例子都很小,它们都是独立完备的(有些人可能会说本书的例子显得空洞,但是,这些例子都是为了说明知识点而设计的)。具体来说,本书内容如下。
第一部分,使用入门
我们以概览Python作为开始,回答了一些常见的问题:为什么要使用这门语言、它有什么用处等。第1章介绍这门技术背后的主要思想,以及历史背景。然后,介绍本书技术方面的内容,我们会探索Python运行程序的方式。介绍这一部分的目标是让读者有足够的知识,可以跟上后面的例子和练习题的步伐。
第二部分,类型和运算
接着,我们开始Python语言之旅,深入研究Python的主要内置对象类型:数字、列表和字典等。使用这些工具,就可以用Python做很多事了。这是本书最重要的一部分,因为这部分内容是学习后续章节的基础。我们也会在此部分谈到动态定型和其引用值:这是掌握Python的关键。
第三部分,语句和语法
本部分开始介绍Python的语句:输入的代码会在Python中创建并处理对象。此外,本部分也会介绍Python的一般语法模型。虽然这一部分的重点是语法,但也会介绍相关的工具。例如,PyDoc系统,并探索其他一些编写代码的方法。
第四部分,函数
在这一部分开始讨论Python的更高层次的程序结构工具。函数是为重用而打包代码并避免代码冗余的简单方式。在这一部分内容中,我们将会探索Python的作用域法则、参数传递等技术。
第五部分,模块
Python模块把语句和函数组织成更大的组件,而这一部分会说明如何创建、使用并重载模块。我们也会在这里看到一些更高级的主题,例如,模块包、模块重载以及_name_变量。
第六部分,类和OOP
在一部分,我们探索了Python的面向对象编程(OOP)工具——类。类是选用的,但却是组织代码来定制和重用的强大工具。读者将会看到,类几乎是重复利用在本书中谈到的概念,而Python的OOP多数就是在链接的对象中查找变量名。读者也会了解到,OOP在Python中是选用的,但是可以帮助减少大量的开发时间,尤其是对长期的策略性项目开发来说更是如此。
第七部分,异常和工具
本书介绍语言基础的最后一部分,讨论Python异常处理模型和语句,加上对开发工具的简介(当读者开始编写较大的程序时,工具就会变得更实用。例如,调试和测试工具)。尽管异常是相当轻量级的工具,这一部分放在类介绍之后,是因为异常现在应该都是类了。
第八部分,高级话题(第4版新增部分,请到华章网站下载)
在最后一部分中,我们介绍了一些高级话题。这里,我们学习了Unicode和字节字符串、特性和描述符这样的管理属性工具、函数和类装饰器,以及元类。这些章都是选读的,因为并不是所有的程序员都需要理解这些章所介绍的话题。另一方面,必须处理国际化文本或二进制数据的读者,或者负责开发API供其他程序员使用的读者,应该会对本部分感兴趣。
第九部分,附录(附录内容请到华章网站下载)
本书结尾是两个附录,介绍了在各种计算机上使用Python的与平台相关的技巧(附录A),并提供了每章结尾习题和每部分末尾的练习题的解答(附录B)。
注意:索引和目录可用于查找细节,但本书没有参考文献附录(本书是教程,而不是参考书)。就像之前提到的一样,读者可以参考《Python Pocket Reference》(O扲eilly)还有其他书籍,以及免费的Python参考手册(参看http://www.python.org)来了解语法和内置工具的细节。
书籍更新
本书在不断地进行完善(输入错误也包括在内)。本书原版的更新、补充以及更正会在下列任一网站进行更新维护。
http://www.oreilly.com/catalog/9780596158064/(O扲eilly的本书的网页)
http://www.rmi.net/~lutz(作者的网站)
http://www.rmi.net/~lutz/about-lp.html(作者的关于本书的网页)
这三个URL中的最后一个是关于本书的网页,我会在此发布更新,如果链接失效了,一定要进行Web搜索。如果我更有洞察力,我会尽力,但网页的修改比印刷书籍要快得多。
关于本书的程序
书中所有程序的例子都是基于Python 3.0版的。此外,这些例子中的大多数都能在Python 2.6下运行,正如本书所提到的,Python 2.6读者的注意事项也会在其中给出提示。
然而,因为本书的重点是核心语言,可以相当肯定,多数内容在Python以后的版本中不会有太多的变化。本书多数内容也适用于早期的Python版本。当然,如果读者尝试使用在其所用版本之后增加的扩展功能,那当然行不通了。
原则就是,最新的Python就是最好的Python。因为本书重点是核心语言,多数内容也适用第2章提到的Jython(基于Java的Python语言实现)以及其他Python的实现。
本书例子的源代码以及练习题的解答都可从本书网站获取:http://www.oreilly.com/catalog/9780596158064/。那么读者该怎样运行例子呢?本书会在第3章介绍运行的细节。
使用代码示例
本书的目的是帮助读者把工作做好。一般来说,读者可以在程序和文档中使用本书的代码,不需要联系我们取得许可,除非是要重新发布大量的代码。例如,编写程序时,使用本书好几段代码,不需要许可。销售和分发O扲eilly范例光盘需要许可。引用本书和例子程序来回答问题,不需要许可。把本书大量例子程序整合到自己的产品文档中则需要许可。
虽然并非必须,但我们会感谢那些标明所有权的行为。所有权通常包括标题、作者、出版社和ISBN。例如,“Learning Python, Fourth Edition, by Mark Lutz. Copyright 2009 Mark Lutz, 978-0-596-15806-4”。
如果读者觉得对程序例子的运用超出合理使用或者上列许可情况之外,可以与我们联系:permissions@oreilly.com。
体例
下面是本书关于印刷字体方面的一些约定:
斜体(Italic)
用于电子信箱、URL、文件名、路径名以及用于强调第一次介绍的新的术语。
等宽字体(Constant width)
用于文件内容以及命令输出,来表示模块、方法、语句以及命令。
等宽粗体(Constant width bold)
用于程序代码段,来显示应该由用户输入的命令或文字,有时则用于强调程序代码的一部分。
等宽斜体(Constant width italic)
用于程序代码段中可替换的部分以及一些注释。
[等宽字体]()
表示应该以真实程序代码取代的语法单元。
注意: 表示和附近文字相关的技巧、建议或一般性注释。
警告: 表示和附近文字相关的警告和注意事项。
注意: 本书例子中,系统命令行开头的%字符指的是系统提示符,这取决于读者的机器(例如,DOS窗口是C:\Python30])。不要自行输入%字符(或者有时候它表示的系统提示)。
同样,在解释器交互模式下所列出的内容中,也不要输入每行开头的]]]和...字符,这些是Python显示的提示符。只要输入这些提示符之后的文字就行了。为了帮助你记住这一点,本书中的用户输入都将以粗体显示。
此外,一般也不需要输入程序清单中以#开头的文字,这些是注释,不是可执行的代码。
联系我们
有关本书的任何建议和疑问,可以与下面的出版社联系:
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们为本书提供了一个网页,其中给出了勘误表、示例和所有的附加信息。可以通过以下地址访问该网页:
http://www.oreilly.com/catalog/9780596158064
要对本书发表评论或询问技术问题,请发电子邮件到:
bookquestions@oreilly.com
有关我们的书籍、会议、资源中心以及O扲eilly网络,可以访问我们的网站:
http://www.oreilly.com
http://www.oreilly.com.cn
致谢
当我在2009年写本书第4版时,我总是抱着某种“完成任务”的心态。我已经使用并推广Python 17年了,而且也已经有12年Python的培训经验了。尽管时间在不断流逝,我依然惊讶于Python这些年来取得的成功。Python的成长,是我们多数人在1992年时难以想象的。所以,也许我得冒着被当成无可救药、固执己见的作者的风险,但是请你谅解一下,我得在这里说一说回忆、恭贺以及感谢的话。
这是漫长而崎岖的道路。今日回首,1992年当我第一次发现Python的时候,我根本不知道它对我未来17年的生活会有什么影响。1995年编写《Programming Python》第一版后的两年,我开始在全国和全世界旅行,为初学者和专家培训Python。从1999年完成本书第一版后,我成为了全职、独立的Python培训师和作家,这得益于Python指数级增长的受欢迎程度。
我在2009年中写下这些话时,已经编写了12本Python书籍(3本是第4版);我培训Python已经超过10年了,而且在美国、欧洲、加拿大以及墨西哥教过225个Python短期培训课程,在此过程中遇到了超过3000位以上的学生。除了频繁地累计飞行里程,这些课程也帮助我精炼本书以及其他Python书籍的内容。几年下来,教学磨炼了书籍,而书籍又反过来磨炼了教学。事实上,你读的这本书的大部分内容都源于我的课程。
因此,我想要感谢过去12年来参加我培训的所有学生。除了Python本身的变化之外,你们的反馈对本书的出版,也扮演了重要角色(没有比看3 000位学生重复犯初学者的错误更有启发性的事了)。本版主要根据2003年后的课程进行修正,不过,从1997年起的每堂课,都对本书的精炼有或多或少的帮助。我要特别感谢那些在都柏林、墨西哥城、巴塞罗那、伦敦、埃德蒙顿以及波多黎各举办课程的那些客户,无法想象有比这更好的培训地点了。
我也想对每一位参与本书制作的人表示感谢。参与这个项目的编辑:这一版的Julie Steele 、前一版的Tatiana Apandi,以及前几版的许多人。感谢Doug Hellmann和Jesse Noller参与本书的技术校对。感谢O扲eilly让我有这个机会写出这12本书;真的很有趣(感觉上有点像电影《偷天情缘(Groundhog Day)》)。
感谢最初的共同作者David Ascher对本书前两版的帮助。David在前几版中贡献了“外层”部分,但是从第3版开始,为了让新的核心语言素材多一点空间,我们不得不忍痛割爱了。我在本版中加了一些更高级的实例和一个全新的高级主题部分作为弥补。请参见本前言前面对于后续应用级内容的说明,一旦你学习了基础知识之后,可能想要学习这些应用级内容。
特别感谢Guido van Rossum和Python社区的人们创造了如此有趣和实用的语言。就像多数开源系统一样,Python是许多英雄努力的结果。拥有了17年的Python编程经验,我依然觉得Python相当有趣。我特别荣幸看到了Python从脚本语言的初级阶段成长为广泛使用的工具,几乎每个编写软件的组织都以某种方式在部署使用它。这是令人兴奋的结果,我想感谢并祝贺整个Python社区,你们做了件很美妙的事。
我也想感谢O扲eilly公司我最初的编辑:已故的Frank Willison。本书大部分都是Frank的想法,反映出他那充满感染力的愿景。回首往事,Frank对我的职业生涯以及Python本身都有很深远的影响。Python刚出现时拥有这么多的乐趣并如此成功,可以说,这都归功于Frank,一点都不夸张。我们还是很想念他。
最后,还有些人要感谢。感谢OQO这么好的玩具。感谢已故的Carl Sagan,让来自威斯康星州的18岁小伙子得到了启发。感谢我的妈妈给予我鼓励。感谢我这几年遇到的所有大型公司,提醒我自己有多么幸运,可以为自己打工。
感谢我的孩子Mike、Sammy以及Roxy,无论他们将来选择做什么。我开始用Python时,你们都还小,而你们似乎也这样长大了,我以你们为荣。生活会让我们一路走下去,但是总会有回家的路。
最需要感谢的是Vera,我最好的朋友、女友以及妻子。我最美妙的日子就是我终于遇见你的那一天。我不知道接下来50年会怎样,但我知道,我想把所有时间都用来拥抱你。
Mark Lutz
佛罗里达州萨拉索市
2009年7月