Brett Slatkin根据自己在Google公司多年开发Python基础架构所积累的经验,揭示了Python语言中一些鲜为人知的微妙特性,并给出了能够改善代码功能及运行效率的习惯用法。书中汇聚了90个优秀的实践原则、开发技巧和便捷方案,并以实用的代码范例来解释它们。通过本书,你能够了解到解决关键编程任务的实用技巧,并学会编写易于理解、便于维护且利于改进的代码。除此之外,本书第2版基本上修改了第1版中的所有条目,以反映Python实践的演变历程。
原味英文著作,还原技术经典。
技术版本更新,Python3 实用指南。
90条实用建议,编写健壮高效代码。
推荐速递
自从2015年本书第1版面世以来,我一直都在极力地推荐这本书。本次更新版针对Python 3进行了更新和扩展,包含了丰富而实用的编程智慧,对于各个阶段的Python编程人员都是一座宝库。
——Wes McKinney,Python Pandas项目创始人,Ursa实验室主任
如果你的编程第一语言不是Python,那么这本书绝对是帮你体验Python所有特性的优秀指南。我使用Python已近二十年,但仍然能够从中汲取一些有用的技巧,特别是关于Python 3新特性的部分。本书提供了丰富的、可操作的建议,这也体现了我们Python编程社区务实的本质。
——Simmon Willison,Django联合创始人
我用Python编程好多年了,我认为我已经很了解Python了。感谢这本书提供的技巧和建议,它们让我意识到我可以使我的Python代码运行得更快(比如使用Python内建的数据结构)、使我的代码更容易阅读(比如强制只使用关键字参数),并且使代码更符合Python语言编程理念的代码风格(比如用zip并行遍历列表)。这本书能够帮助我们快速熟悉Python 3,比如walrus操作符、f-string和typing模块。
——Pamela Fox,Khan Academy编程课程创始人
在八次小版本升级和众多新特性加入后,Python 3终于成了标准版本。Brett Slatkin的Effective Python第2版归来了,其包含了全新的Python语法列表和清晰明确的建议。现在我们已经逐渐脱离Python 2,并且都想上手Python 3。这本书能够帮助我们熟悉Python 3版本的一切。书中前半部分列举了大量关于Python 3语法和概念方面的技巧,诸如字符串对象和字节对象、f-string、赋值表达(和其不被熟知的昵称),以及全方位元组拆包等。后半部分的章节主题更大一些,其中的内容或是我之前不了解的,或是我一直想教给别人的。例如元类和属性,其中“相比元类,优先选择类装饰器”是一条好建议,而__init_subclass__()是我之前并不熟悉的神奇方法;再如并发机制,其中我最喜欢的一条建议是“使用线程而非并行性来阻塞I/O”,但是它也正确涵盖了异步和协程部分;最后还涉及稳健性和性能,其中给出的建议是“优化前做好配置”。阅读本书的每一章节都是一种享受,每一条建议都是很优秀且叙述得当的。未来我也会经常引用这本书中的内容,因为书中涉及了太多好的建议。如果有一个评比是“如果你今年只读一本Python书,那么这本书应该是……”,那么这本书绝对是赢家。
——Mike Bayer,SQLAlchemy创始人
对于初学者和资深程序员,这都是一本好书。编程示例和解析构思清晰、叙述简练完整。第2版针对Python 3更新了建议,这太棒了!我已经使用Python大约二十年了,每读几页仍然会有新发现。这本书中的建议对任何人都有益处。
——Titus Brown,加州大学戴维斯分校副教授
Brett Slatkin再一次成功地把Python社区中大量的操作实例整合到了一本书中。从荆棘丛生的元类和并发机制话题部分,到稳健性、测试和协作等关键基础部分,本书成功地向广泛的受众解释了什么叫作Python。
——Brandon Rhodes,python-patterns.guide的作者
前言
Python编程语言具有独特的优势和魅力,有时难以掌握。很多熟悉其他编程语言的程序员接触Python时常常会受到思维定势的影响,而无法去拥抱它的全部表现力。有些程序员在相反的方向上走得太远,过度使用Python的特性可能会为之后的编程埋下隐患。
这本书对什么是Pythonic式的编程提出了深刻见解,也就是回答了“什么才是使用Python的最佳方式”。我假设读者已经对Python语言有了基础的理解和掌握。新手程序员能够从实例中学习如何发挥Python的实力,有经验的程序员则能够自信地应对Python新版本带来的陌生感。
我的目的是帮助你运用Python去创造不同。
本书内容
本书中每个章节涵盖内容广泛,且相互关联。你大可根据自己的兴趣浏览各个板块。每个项目都包含简单明确的指导,说明了如何更有效地编写Python程序。项目中的建议包括:如何做、需要避免什么、如何取得适当的平衡,以及为什么这是最好的选择。各个项目之间标明了相互之间的参考和引用,这样有助于你在阅读时及时填补理解的缺失。
本书第2版专门聚焦于Python 3(参阅Item 1:Know Which Version of Python You’re Using),并涵盖了3.8版本。本书第1版的大部分原创内容都经修改后收录在本书中。注意,大部分内容都经过了更新。对于一些项目,我在第2版中的建议完全区别于第1版,原因在于Python在不断成熟,最佳实践也在不断进化。如果你的首选仍是Python 2,那么第1版会更适合你。需要注意,Python 2已在2020年1月1日已经停止维护。
不同于其他众多编程语言只附带少量的通用包,需要程序员额外去寻找一些重要功能的组件,Python的标准库采取了内置电池(battery included)的构建思路。许多内置包与Python的原生语言紧密耦合,我们甚至可以将其看作构成Python语言标准的一部分。完整的标准模块对于这本书来说过于庞大,但是我仍然将我认为最重要且常用的部分囊括了进来。
Chapter 1: Pythonic Thinking
Python开发者用Pythonic这个形容词来描述具有特定风格的代码。这种风格是大家在使用Python语言进行编程并相互协作的过程中逐渐形成的习惯。本章将讲解如何以该风格来完成常见的Python编程工作。
Chapter 2: Lists and Dictionaries
在Python中,组织信息最常见的方式是把一系列值存储在一个“列表”中。dict是列表的天然补充,它将每个键都映射到对应的值上。本章将介绍如何运用这组“多面手”构建程序。
Chapter 3: Functions
Python中的函数具备多种特性,可以简化编程工作。Python函数的某些性质与其他编程语言中的函数相似,但也有些特性是Python独有的。本章将介绍如何用函数来表达意图、提升可复用程度,并减少bug。
Chapter 4: Comprehensions and Generators
Python有着特殊的语法,可以快速遍历列表、字典和集合,从而快速迭代,生成衍生数据结构。它还允许函数以递增的方式返回可迭代值流。本章将介绍如何通过这些特性提供更好的性能、降低内存占用,并且提高可读性。
Chapter 5: Classes and Interfaces
Python是面向对象的语言。用Python编程时,通常需要编写新类,并定义这些类应该如何通过其接口及继承体系与外界交互。本章将介绍如何运用类来表达你使用对象的意图。
Chapter 6: Metaclasses and Attributes
元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然而它们也可能导致极其古怪、突然的行为。本章将讲解这些机制的常见用法,以确保读者写出来的代码符合最小惊讶原则(rule of least surprise)。
Chapter 7: Concurrency and Parallelism
Python很容易就能写出并发程序,这种程序可以在同一时间做许多件不同的事情。我们也可以通过系统调用、子进程(subprocess)及C语言扩展来实现并行处理。本章将讲解如何在不同的情况下充分利用这些Python特性。
Chapter 8: Robustness and Performance
Python中的一些内置特性和模块可以帮助你加固程序,所以它们是可靠的。Python也包含了帮助你用最小的力气取得最好性能的工具。本章将介绍如何使用Python优化你的程序以取得最高可靠性和最优效率。
Chapter 9: Testing and Debugging
不管使用何种语言,都应该经常测试程序。然而,Python的动态特性可能以特殊的方式增加运行时发生错误的风险。幸运的是,这也令编写测试程序和故障诊断程序更加容易。本章将介绍Python内置的测试和调试工具。
Chapter 10: Collaboration
如果多人协作开发Python程序,就需要仔细思考如何编写代码。即使一个人独自开发,也要了解如何使用别人所写的模块。本章将讲解多人协作开发Python程序时所用的标准工具及最佳做法。
本书中一些约定
本书中的Python代码片段使用等宽字体,语法则使用加粗字体。一行太长时,? 字符表示换行。省略号(...)表示与表达观点无关的代码。你需要下载完整的代码使之能在你的电脑上运行(下载方式后述)。
本书参考了Python风格指南(Python style guide),对范例代码的格式进行了修改,使之便于印刷,也便于凸显其中的重要内容。为了缩减范例代码的篇幅,内嵌文档被删去了。读者在开发自己的项目时不应该这么做,而应该遵循Python风格指南(详见Item 2:“Follow the PEP 8 Style Guide”),列出文档(详见Item 84:“Write Docstrings for Every Function, Class, and Module”)。
书中大部分代码运行之后都会产生输出(output)。这里所谓的输出,是指在交互式解释器(interactive interpreter)中运行这些Python程序时,控制台或终端机里面打印出的一些信息。这些打印出来的信息,以等宽字体印刷,它们上方的那一行会标有>>>符号(这个>>>符号是Python解释器的提示符)。使用这个符号是想告诉大家:把>>>上方的那些范例代码输入Python shell之后,会产生与>>>下方文字相符的输出信息。
除此之外,还有一些上方虽无>>>符号,但却以等宽字体印刷的代码段。这些内容用来表示产生于Python解释器之外的输出信息。它们的上方通常都会有$字符,表示笔者是通过Bash之类的命令行shell先运行了程序,然后才产生这些输出的。
获取代码和勘误表
查看本书中的一些完整代码是很有用的,因为书中的某些范例是不完整的。这也给你提供了一个机会重新理解代码:为什么程序会按照描述的那样运行。全部源码都可以从本书网站(http://www.effectivepython.com)下载。书中的勘误也会在网站上公布。
致谢
本书的面世离不开生活中很多人的指导、支持和鼓励。
感谢Effective Software Development系列的顾问 Scott Meyers。我15岁的时候第一次看Effective C++,那时候就爱上了C++。毫无疑问,Scott的图书指引了我的学术之路,并帮助我找到了第一份工作。我很荣幸能够编写本书。
感谢技术审阅者们为本书第2版提供了深度且完整的反馈,他(她)们是:Andy Chu、Nick Cohron、Andrew Dolan、Asher Mancinelli和Alex Martelli。感谢我在Google的同事们的审阅和建议。没有你们的帮助,这本书定将晦涩难懂。
感谢培生教育出版集团参与本书第2版的每个工作人员,你们让这本书得以面世。感谢我的执行编辑Debra Williams在整个过程中提供的支持。感谢出版团队成员的帮助:开发编辑Chris Zahn、市场销售经理Stephane Nakib、文字编辑Catherine Wilson、高级项目编辑Lori Lyons,以及封面设计师Chuti Prasertsith。
感谢帮助我撰写本书第1版的所有人:Trina MacDonald、Brett Cannon、Tavis Rudd、Mike Taylor、Leah Culver、Adrian Holovaty、Michael Levine、Marzia Niccolai、Ade Oshineye、Katrina Sostek、Tom Cirtin、Chris Zahn、Olivia Basegio、Stephane Nakib、Stephanie Geels、Julie Nahil和Toshiaki Kurokawa。感谢所有反馈错误和改进意见的读者们。感谢所有的翻译人员,你们帮助这本书走向世界各地。
感谢我知道并且合作过的出色的Python程序员Anthony Baxter、Brett Cannon、Wesley Chun、Jeremy Hylton、Alex Martelli、Neal Norwitz、Guido van Rossum、Andy Smith、Greg Stein、Ka-Ping Yee。我很感激你们的督促和指导。Python有一个优秀的社区,我非常幸运能成为其中的一员。
感谢诸位同事这些年来对我的关照。感谢Kevin Gibbs帮我应对风险。感谢 Ken Ashcraft、Ryan Barrett、Jon McAlister教我如何工作。感谢Brad Fitzpatrick让我们的团队达到一个新的水准。感谢Paul McDonald陪我一起创建我们的搞怪项目。感谢Jeremy Ginsberg、Jack Hebert、John Skidgel、Evan Martin、Tony Chang、Troy Trimble、Tessa Pupius和Dylan Lorimer帮助我进行学习。感谢Sagnik Nandy和Waleed Ojeil的精神指导。
感谢激发我编程兴趣的诸位老师:Ben Chelf、Glenn Cowan、Vince Hugo、Russ Lewin、Jon Stemmle、Derek Thomson和Daniel Wang。没有你们的指导,我永远不会掌握这门技艺,或者具备教授他人的眼界。
感谢母亲使我找到了人生的目标并鼓励我做程序员。感谢兄弟、祖父母、众亲戚及儿时的玩伴,从小你们就是我的榜样,也使我找到了成长的快乐。
最后,感谢我的爱人Colleen,谢谢你的爱、支持,以及你给我带来的欢笑。
读者服务
微信扫码回复:38693
?获取博文视点学院20元付费内容抵扣券
?获取免费增值资源
?获取本书代码资源
?获取精选书单推荐
作者简介
Brett Slaktin,Google首席软件工程师、Google消费者调查项目工程主管及联合创始人、PubSubHubbub 协议联合创始人。他启动了Google第一个云计算产品App Engine。十四年前,他在实习时使用Python管理了Google大量的服务器。
在日常工作之余,他喜欢弹钢琴和冲浪。他也喜欢在自己的网站上发布一些编程相关的话题和文章。他拥有纽约市哥伦比亚大学计算机工程学士学位。现居旧金山。