个元素28
2.4.2对对象进行切片29
2.4.3多维切片和省略30
2.4.4给切片赋值31
2.5对序列使用+和*31
2.6序列的增量赋值33
2.7list.sort方法和内置函数sorted36
2.8用bisect来管理已排序的序列37
2.8.1用bisect来搜索38
2.8.2用bisect.insort插入新元素40
2.9当列表不是首选时41
2.9.1数组41
2.9.2内存视图44
2.9.3NumPy和SciPy45
2.9.4双向队列和其他形式的队列47
2.10本章小结49
2.11延伸阅读50
第3章字典和集合54
3.1泛映射类型54
3.2字典推导56
3.3常见的映射方法57
3.4映射的弹性键查询61
3.4.1defaultdict:处理找不到的键的一个选择61
3.4.2特殊方法__missing__62
3.5字典的变种65
3.6子类化UserDict65
3.7不可变映射类型67
3.8集合论68
3.8.1集合字面量69
3.8.2集合推导71
3.8.3集合的操作71
3.9dict和set的背后73
3.9.1一个关于效率的实验74
3.9.2字典中的散列表75
3.9.3dict的实现及其导致的结果78
3.9.4set的实现以及导致的结果80
3.10本章小结80
3.11延伸阅读81
第4章文本和字节序列83
4.1字符问题84
4.2字节概要85
4.3基本的编解码器88
4.4了解编解码问题89
4.4.1处理UnicodeEncodeError90
4.4.2处理UnicodeDecodeError90
4.4.3使用预期之外的编码加载模块时抛出的SyntaxError91
4.4.4如何找出字节序列的编码92
4.4.5BOM:有用的鬼符93
4.5处理文本文件94
4.6为了正确比较而规范化Unicode字符串99
4.6.1大小写折叠101
4.6.2规范化文本匹配实用函数102
4.6.3极端“规范化”:去掉变音符号103
4.7Unicode文本排序105
4.8Unicode数据库108
4.9支持字符串和字节序列的双模式API109
4.9.1正则表达式中的字符串和字节序列109
4.9.2os函数中的字符串和字节序列111
4.10本章小结112
4.11延伸阅读113
第三部分把函数视作对象
第5章一等函数118
5.1把函数视作对象119
5.2高阶函数120
5.3匿名函数122
5.4可调用对象122
5.5用户定义的可调用类型123
5.6函数内省124
5.7从定位参数到仅限关键字参数126
5.8获取关于参数的信息127
5.9函数注解131
5.10支持函数式编程的包132
5.10.1operator模块132
5.10.2使用functools.partial冻结参数135
5.11本章小结137
5.12延伸阅读137
第6章使用一等函数实现设计模式141
6.1案例分析:重构“策略”模式142
6.1.1经典的“策略”模式142
6.1.2使用函数实现“策略”模式145
6.1.3选择最佳策略:简单的方式148
6.1.4找出模块中的全部策略149
6.2“命令”模式150
6.3本章小结151
6.4延伸阅读152
第7章函数装饰器和闭包154
7.1装饰器基础知识155
7.2Python何时执行装饰器156
7.3使用装饰器改进“策略”模式157
7.4变量作用域规则159
7.5闭包161
7.6nonlocal声明164
7.7实现一个简单的装饰器165
7.8标准库中的装饰器168
7.8.1使用functools.lru_cache做备忘168
7.8.2单分派泛函数170
7.9叠放装饰器172
7.10参数化装饰器173
7.10.1一个参数化的注册装饰器173
7.10.2参数化clock装饰器175
7.11本章小结177
7.12延伸阅读178
第四部分面向对象惯用法
第8章对象引用、可变性和垃圾回收182
8.1变量不是盒子183
8.2标识、相等性和别名184
8.2.1在==和is之间选择185
8.2.2元组的相对不可变性186
8.3默认做浅复制187
8.4函数的参数作为引用时190
8.4.1不要使用可变类型作为参数的默认值191
8.4.2防御可变参数193
8.5del和垃圾回收195
8.6弱引用196
8.6.1WeakValueDictionary简介197
8.6.2弱引用的局限199
8.7Python对不可变类型施加的把戏199
8.8本章小结201
8.9延伸阅读201
第9章符合Python风格的对象205
9.1对象表示形式206
9.2再谈向量类206
9.3备选构造方法208
9.4classmethod与staticmethod209
9.5格式化显示210
9.6可散列的Vector2d213
9.7Python的私有属性和“受保护的”属性218
9.8使用__slots__类属性节省空间220
9.9覆盖类属性222
9.10本章小结224
9.11延伸阅读225
第10章序列的修改、散列和切片229
10.1Vector类:用户定义的序列类型230
10.2Vector类第1版:与Vector2d类兼容230
10.3协议和鸭子类型232
10.4Vector类第2版:可切片的序列233
10.4.1切片原理234
10.4.2能处理切片的__getitem__方法236
10.5Vector类第3版:动态存取属性237
10.6Vector类第4版:散列和快速等值测试240
10.7Vector类第5版:格式化244
10.8本章小结251
10.9延伸阅读251
第11章接口:从协议到抽象基类256
11.1Python文化中的接口和协议257
11.2Python喜欢序列258
11.3使用猴子补丁在运行时实现协议260
11.4AlexMartelli的水禽262
11.5定义抽象基类的子类266
11.6标准库中的抽象基类267
11.6.1collections.abc模块中的抽象基类267
11.6.2抽象基类的数字塔269
11.7定义并使用一个抽象基类270
11.7.1抽象基类句法详解273
11.7.2定义Tombola抽象基类的子类274
11.7.3Tombola的虚拟子类276
11.8Tombola子类的测试方法278
11.9Python使用register的方式281
11.10鹅的行为有可能像鸭子281
11.11本章小结283
11.12延伸阅读284
第12章继承的优缺点289
12.1子类化内置类型很麻烦289
12.2多重继承和方法解析顺序292
12.3多重继承的真实应用296
12.4处理多重继承298
12.5一个现代示例:Django通用视图中的混入301
12.6本章小结304
12.7延伸阅读304
第13章正确重载运算符307
13.1运算符重载基础308
13.2一元运算符308
13.3重载向量加法运算符+310
13.4重载标量乘法运算符*315
13.5众多比较运算符318
13.6增量赋值运算符321
13.7本章小结325
13.8延伸阅读326
第五部分控制流程
第14章可迭代的对象、迭代器和生成器330
14.1Sentence类第1版:单词序列331
14.2可迭代的对象与迭代器的对比334
14.3Sentence类第2版:典型的迭代器337
14.4Sentence类第3版:生成器函数339
14.5Sentence类第4版:惰性实现343
14.6Sentence类第5版:生成器表达式344
14.7何时使用生成器表达式345
14.8另一个示例:等差数列生成器346
14.9标准库中的生成器函数349
14.10Python3.3中新出现的句法:yieldfrom357
14.11可迭代的归约函数358
14.12深入分析iter函数359
14.13案例分析:在数据库转换工具中使用生成器360
14.14把生成器当成协程362
14.15本章小结362
14.16延伸阅读363
第15章上下文管理器和else块368
15.1先做这个,再做那个:if语句之外的else块369
15.2上下文管理器和with块370
15.3contextlib模块中的实用工具374
15.4使用@contextmanager375
15.5本章小结378
15.6延伸阅读378
第16章协程381
16.1生成器如何进化成协程382
16.2用作协程的生成器的基本行为382
16.3示例:使用协程计算移动平均值385
16.4预激协程的装饰器386
16.5终止协程和异常处理388
16.6让协程返回值391
16.7使用yieldfrom393
16.8yieldfrom的意义398
16.9使用案例:使用协程做离散事件仿真403
16.9.1离散事件仿真简介403
16.9.2出租车队运营仿真404
16.10本章小结410
16.11延伸阅读411
第17章使用期物处理并发416
17.1示例:网络下载的三种风格416
17.1.1依序下载的脚本418
17.1.2使用concurrent.futures模块下载420
17.1.3期物在哪里421
17.2阻塞型I/O和GIL424
17.3使用concurrent.futures模块启动进程424
17.4实验Executor.map方法426
17.5显示下载进度并处理错误429
17.5.1flags2系列示例处理错误的方式433
17.5.2使用futures.as_completed函数435
17.5.3线程和多进程的替代方案437
17.6本章小结437
17.7延伸阅读438
第18章使用asyncio包处理并发442
18.1线程与协程对比443
18.1.1asyncio.Future:故意不阻塞448
18.1.2从期物、任务和协程中产出449
18.2使用asyncio和aiohttp包下载450
18.3避免阻塞型调用454
18.4改进asyncio下载脚本456
18.4.1使用asyncio.as_completed函数456
18.4.2使用Executor对象,防止阻塞事件循环461
18.5从回调到期物和协程462
18.6使用asyncio包编写服务器466
18.6.1使用asyncio包编写TCP服务器467
18.6.2使用aiohttp包编写Web服务器471
18.6.3更好地支持并发的智能客户端474
18.7本章小结475
18.8延伸阅读476
第六部分元编程
第19章动态属性和特性482
19.1使用动态属性转换数据483
19.1.1使用动态属性访问JSON类数据485
19.1.2处理无效属性名487
19.1.3使用__new__方法以灵活的方式创建对象488
19.1.4使用shelve模块调整OSCON数据源的结构490
19.1.5使用特性获取链接的记录493
19.2使用特性验证属性498
19.2.1LineItem类第1版:表示订单中商品的类498
19.2.2LineItem类第2版:能验证值的特性499
19.3特性全解析500
19.3.1特性会覆盖实例属性501
19.3.2特性的文档503
19.4定义一个特性工厂函数504
19.5处理属性删除操作506
19.6处理属性的重要属性和函数507
19.6.1影响属性处理方式的特殊属性507
19.6.2处理属性的内置函数508
19.6.3处理属性的特殊方法509
19.7本章小结510
19.8延伸阅读510
第20章属性描述符514
20.1描述符示例:验证属性514
20.1.1LineItem类第3版:一个简单的描述符515
20.1.2LineItem类第4版:自动获取储存属性的名称519
20.1.3LineItem类第5版:一种新型描述符524
20.2覆盖型与非覆盖型描述符对比526
20.2.1覆盖型描述符528
20.2.2没有__get__方法的覆盖型描述符529
20.2.3非覆盖型描述符530
20.2.4在类中覆盖描述符531
20.3方法是描述符531
20.4描述符用法建议533
20.5描述符的文档字符串和覆盖删除操作534
20.6本章小结535
20.7延伸阅读536
第21章类元编程538
21.1类工厂函数539
21.2定制描述符的类装饰器541
21.3导入时和运行时比较543
21.4元类基础知识547
21.5定制描述符的元类552
21.6元类的特殊方法__prepare__554
21.7类作为对象556
21.8本章小结557
21.9延伸阅读557
结语560
附录A辅助脚本563
Python术语表588
作者简介600
关于封面600