书籍作者:累计评价 0 | ISBN:9787121386930 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:3773 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
推荐速递
自从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程序时,控制台或终端机里面打印出的一些信息。这些打印出来的信息,以等宽字体印刷,它们上方的那一行会
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?CConsumer 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
排版清楚,纸质很好。虽然已有电子版,但还是认为有必要买纸质版经常翻一翻,记一记。
2020-06-13 11:43:11