Effective Python:改善Python程序的90个建议 (第2版)(英文版)
  • 推荐0
  • 收藏0
  • 浏览1.3K

Effective Python:改善Python程序的90个建议 (第2版)(英文版)

Brett Slatkin (作者)  刘佳禾 (责任编辑)

  • 书  号:978-7-121-38693-0
  • 出版日期:2020-05-26
  • 页  数:460
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:刘佳禾
纸质版 ¥128.00
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大量的服务器。
在日常工作之余,他喜欢弹钢琴和冲浪。他也喜欢在自己的网站上发布一些编程相关的话题和文章。他拥有纽约市哥伦比亚大学计算机工程学士学位。现居旧金山。

目录

Chapter 1 Pythonic Thinking 1
Item 1: Know Which Version of Python You’re Using 1
Item 2: Follow the PEP 8 Style Guide 2
Item 3: Know the Differences Between bytes and str 5
Item 4: Prefer Interpolated F-Strings Over C-style
Format Strings and str.format 11
Item 5: Write Helper Functions Instead of
Complex Expressions 21
Item 6: Prefer Multiple Assignment Unpacking
Over Indexing 24
Item 7: Prefer enumerate Over range 28
Item 8: Use zip to Process Iterators in Parallel 30
Item 9: Avoid else Blocks After for and while Loops 32
Item 10: Prevent Repetition with Assignment Expressions 35
Chapter 2 Lists and Dictionaries 43
Item 11: Know How to Slice Sequences 43
Item 12: Avoid Striding and Slicing in a Single Expression 46
Item 13: Prefer Catch-All Unpacking Over Slicing 48
Item 14: Sort by Complex Criteria Using the key Parameter 52
Item 15: Be Cautious When Relying on dict
Insertion Ordering 58
Item 16: Prefer get Over in and KeyError to
Handle Missing Dictionary Keys 65
Item 17: Prefer defaultdict Over setdefault to
Handle Missing Items in Internal State 70
Item 18: Know How to Construct Key-Dependent
Default Values with __missing__ 73
Chapter 3 Functions 77
Item 19: Never Unpack More Than Three Variables
When Functions Return Multiple Values 77
Item 20: Prefer Raising Exceptions to Returning None 80
Item 21: Know How Closures Interact with Variable Scope 83
Item 22: Reduce Visual Noise with Variable
Positional Arguments 87
Item 23: Provide Optional Behavior with Keyword Arguments 90
Item 24: Use None and Docstrings to Specify
Dynamic Default Arguments 94
Item 25: Enforce Clarity with Keyword-Only and
Positional-Only Arguments 97
Item 26: Define Function Decorators with functools.wraps 102
Chapter 4 Comprehensions and Generators 107
Item 27: Use Comprehensions Instead of map and filter 107
Item 28: Avoid More Than Two Control Subexpressions in
Comprehensions 109
Item 29: Avoid Repeated Work in Comprehensions by Using
Assignment Expressions 111
Item 30: Consider Generators Instead of Returning Lists 114
Item 31: Be Defensive When Iterating Over Arguments 117
Item 32: Consider Generator Expressions for Large List
Comprehensions 122
Item 33: Compose Multiple Generators with yield from 124
Item 34: Avoid Injecting Data into Generators with send 127
Item 35: Avoid Causing State Transitions in
Generators with throw 133
Item 36: Consider itertools for Working with Iterators
and Generators 138
Chapter 5 Classes and Interfaces 145
Item 37: Compose Classes Instead of Nesting
Many Levels of Built-in Types 145
Item 38: Accept Functions Instead of Classes for
Simple Interfaces 152
Item 39: Use @classmethod Polymorphism to
Construct Objects Generically 155
Item 40: Initialize Parent Classes with super 160
Item 41: Consider Composing Functionality
with Mix-in Classes 165
Item 42: Prefer Public Attributes Over Private Ones 170
Item 43: Inherit from collections.abc for
Custom Container Types 175
Chapter 6 Metaclasses and Attributes 181
Item 44: Use Plain Attributes Instead of Setter and
Getter Methods 181
Item 45: Consider @property Instead of
Refactoring Attributes 186
Item 46: Use Descriptors for Reusable @property Methods 190
Item 47: Use __getattr__, __getattribute__, and
__setattr__ for Lazy Attributes 195
Item 48: Validate Subclasses with __init_subclass__ 201
Item 49: Register Class Existence with __init_subclass__ 208
Item 50: Annotate Class Attributes with __set_name__ 214
Item 51: Prefer Class Decorators Over Metaclasses for
Composable Class Extensions 218
Chapter 7 Concurrency and Parallelism 225
Item 52: Use subprocess to Manage Child Processes 226
Item 53: Use Threads for Blocking I/O, Avoid for Parallelism 230
Item 54: Use Lock to Prevent Data Races in Threads 235
Item 55: Use Queue to Coordinate Work Between Threads 238
Item 56: Know How to Recognize When Concurrency
Is Necessary 248
Item 57: Avoid Creating New Thread Instances for
On-demand Fan-out 252
Item 58: Understand How Using Queue for
Concurrency Requires Refactoring 257
Item 59: Consider ThreadPoolExecutor When Threads
Are Necessary for Concurrency 264
Item 60: Achieve Highly Concurrent I/O with Coroutines 266
Item 61: Know How to Port Threaded I/O to asyncio 271
Item 62: Mix Threads and Coroutines to Ease the
Transition to asyncio 282
Item 63: Avoid Blocking the asyncio Event Loop to
Maximize Responsiveness 289
Item 64: Consider concurrent.futures for True Parallelism 292
Chapter 8 Robustness and Performance 299
Item 65: Take Advantage of Each Block in try/except
/else/finally 299
Item 66: Consider contextlib and with Statements
for Reusable try/finally Behavior 304
Item 67: Use datetime Instead of time for Local Clocks 308
Item 68: Make pickle Reliable with copyreg 312
Item 69: Use decimal When Precision Is Paramount 319
Item 70: Profile Before Optimizing 322
Item 71: Prefer deque for Producer–Consumer Queues 326
Item 72: Consider Searching Sorted Sequences with bisect 334
Item 73: Know How to Use heapq for Priority Queues 336
Item 74: Consider memoryview and bytearray for
Zero-Copy Interactions with bytes 346
Chapter 9 Testing and Debugging 353
Item 75: Use repr Strings for Debugging Output 354
Item 76: Verify Related Behaviors in TestCase Subclasses 357
Item 77: Isolate Tests from Each Other with setUp,
tearDown, setUpModule, and tearDownModule 365
Item 78: Use Mocks to Test Code with
Complex Dependencies 367
Item 79: Encapsulate Dependencies to Facilitate
Mocking and Testing 375
Item 80: Consider Interactive Debugging with pdb 379
Item 81: Use tracemalloc to Understand Memory
Usage and Leaks 384
Chapter 10 Collaboration 389
Item 82: Know Where to Find Community-Built Modules 389
Item 83: Use Virtual Environments for Isolated and
Reproducible Dependencies 390
Item 84: Write Docstrings for Every Function,
Class, and Module 396
Item 85: Use Packages to Organize Modules and
Provide Stable APIs 401
Item 86: Consider Module-Scoped Code to
Configure Deployment Environments 406
Item 87: Define a Root Exception to Insulate
Callers from APIs 408
Item 88: Know How to Break Circular Dependencies 413
Item 89: Consider warnings to Refactor and Migrate Usage 418
Item 90: Consider Static Analysis via typing to Obviate Bugs 425
Index 435

读者评论