下载地址:https://pan.baidu.com/s/1TrNBQL8VqUf6Yd41idVXXA
提取码: ye8i
[巴西] Luciano Ramalho 著
安道 吴珂 译
目录
前言 ....................................................................................................................................................... xvii
第一部分 序幕
第 1 章 Python 数据模型 ................................................................................................................. 2
1.1 一摞 Python 风格的纸牌 ............................................................................................................ 3
1.2 如何使用特殊方法 ..................................................................................................................... 6
1.2.1 模拟数值类型 ................................................................................................................ 7
1.2.2 字符串表示形式 ............................................................................................................ 9
1.2.3 算术运算符 .................................................................................................................. 10
1.2.4 自定义的布尔值 .......................................................................................................... 10
1.3 特殊方法一览 ........................................................................................................................... 10
1.4 为什么 len 不是普通方法 ....................................................................................................... 12
1.5 本章小结 ................................................................................................................................... 12
1.6 延伸阅读 ................................................................................................................................... 13
第二部分 数据结构
第 2 章 序列构成的数组 ................................................................................................................ 16
2.1 内置序列类型概览 ................................................................................................................... 17
2.2 列表推导和生成器表达式 ....................................................................................................... 18
2.2.1 列表推导和可读性 ...................................................................................................... 18
2.2.2 列表推导同 filter 和 map 的比较 ............................................................................. 20
viii | 目录
2.2.3 笛卡儿积 ...................................................................................................................... 20
2.2.4 生成器表达式 .............................................................................................................. 21
2.3 元组不仅仅是不可变的列表 ................................................................................................... 22
2.3.1 元组和记录 .................................................................................................................. 23
2.3.2 元组拆包 ...................................................................................................................... 23
2.3.3 嵌套元组拆包 .............................................................................................................. 25
2.3.4 具名元组 ...................................................................................................................... 26
2.3.5 作为不可变列表的元组 .............................................................................................. 27
2.4 切片 ........................................................................................................................................... 28
2.4.1 为什么切片和区间会忽略最后一个元素 .................................................................. 28
2.4.2 对对象进行切片 .......................................................................................................... 29
2.4.3 多维切片和省略 .......................................................................................................... 30
2.4.4 给切片赋值 .................................................................................................................. 31
2.5 对序列使用 + 和 * .................................................................................................................... 31
2.6 序列的增量赋值 ....................................................................................................................... 33
2.7 list.sort 方法和内置函数 sorted ........................................................................................ 36
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.3 NumPy 和 SciPy ........................................................................................................... 45
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.1 defaultdict :处理找不到的键的一个选择 ............................................................. 61
3.4.2 特殊方法 __missing__ ................................................................................................ 62
3.5 字典的变种 ............................................................................................................................... 65
3.6 子类化 UserDict ...................................................................................................................... 65
3.7 不可变映射类型 ....................................................................................................................... 67
3.8 集合论 ....................................................................................................................................... 68
目录 |
ix
3.8.1 集合字面量 .................................................................................................................. 69
3.8.2 集合推导 ...................................................................................................................... 71
3.8.3 集合的操作 .................................................................................................................. 71
3.9 dict 和 set 的背后 .................................................................................................................. 73
3.9.1 一个关于效率的实验 .................................................................................................. 74
3.9.2 字典中的散列表 .......................................................................................................... 75
3.9.3 dict 的实现及其导致的结果 ...................................................................................... 78
3.9.4 set 的实现以及导致的结果 ........................................................................................ 80
3.10 本章小结 ................................................................................................................................. 80
3.11 延伸阅读 ................................................................................................................................. 81
第 4 章 文本和字节序列 ................................................................................................................ 83
4.1 字符问题 ................................................................................................................................... 84
4.2 字节概要 ................................................................................................................................... 85
4.3 基本的编解码器 ....................................................................................................................... 88
4.4 了解编解码问题 ....................................................................................................................... 89
4.4.1 处理 UnicodeEncodeError ........................................................................................... 90
4.4.2 处理 UnicodeDecodeError ........................................................................................... 90
4.4.3 使用预期之外的编码加载模块时抛出的 SyntaxError ............................................ 91
4.4.4 如何找出字节序列的编码 .......................................................................................... 92
4.4.5 BOM:有用的鬼符 ..................................................................................................... 93
4.5 处理文本文件 ........................................................................................................................... 94
4.6 为了正确比较而规范化 Unicode 字符串 ............................................................................... 99
4.6.1 大小写折叠 ................................................................................................................ 101
4.6.2 规范化文本匹配实用函数 ........................................................................................ 102
4.6.3 极端“规范化”:去掉变音符号 ............................................................................. 103
4.7 Unicode 文本排序 .................................................................................................................. 105
4.8 Unicode 数据库 ...................................................................................................................... 108
4.9 支持字符串和字节序列的双模式 API ................................................................................. 109
4.9.1 正则表达式中的字符串和字节序列 ........................................................................ 109
4.9.2 os 函数中的字符串和字节序列 ................................................................................ 111
4.10 本章小结 ............................................................................................................................... 112
4.11 延伸阅读 ............................................................................................................................... 113
第三部分 把函数视作对象
第 5 章 一等函数 ............................................................................................................................ 118
5.1 把函数视作对象 ..................................................................................................................... 119
x | 目录
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.1 operator 模块 ......................................................................................................... 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.2 Python 何时执行装饰器 ......................................................................................................... 156
7.3 使用装饰器改进“策略”模式 ............................................................................................. 157
7.4 变量作用域规则 ..................................................................................................................... 159
7.5 闭包 ......................................................................................................................................... 161
7.6 nonlocal 声明 ........................................................................................................................ 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
目录 |
xi
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.5 del 和垃圾回收 ...................................................................................................................... 195
8.6 弱引用 ..................................................................................................................................... 196
8.6.1 WeakValueDictionary 简介 ....................................................................................... 197
8.6.2 弱引用的局限 ............................................................................................................ 199
8.7 Python 对不可变类型施加的把戏 ......................................................................................... 199
8.8 本章小结 ................................................................................................................................. 201
8.9 延伸阅读 ................................................................................................................................. 201
第 9 章 符合 Python 风格的对象 .............................................................................................. 205
9.1 对象表示形式 ......................................................................................................................... 206
9.2 再谈向量类 ............................................................................................................................. 206
9.3 备选构造方法 ......................................................................................................................... 208
9.4 classmethod 与 staticmethod ............................................................................................... 209
9.5 格式化显示 ............................................................................................................................. 210
9.6 可散列的 Vector2d ................................................................................................................ 213
9.7 Python 的私有属性和“受保护的”属性 ............................................................................. 218
9.8 使用 __slots__ 类属性节省空间 .......................................................................................... 220
9.9 覆盖类属性 ............................................................................................................................. 222
9.10 本章小结 ............................................................................................................................... 224
9.11 延伸阅读 ............................................................................................................................... 225
第 10 章 序列的修改、散列和切片 .......................................................................................... 229
10.1 Vector 类:用户定义的序列类型 ...................................................................................... 230
10.2 Vector 类第 1 版:与 Vector2d 类兼容 ............................................................................. 230
xii | 目录
10.3 协议和鸭子类型 ................................................................................................................... 232
10.4 Vector 类第 2 版:可切片的序列 ...................................................................................... 233
10.4.1 切片原理 ................................................................................................................. 234
10.4.2 能处理切片的 __getitem__ 方法 .......................................................................... 236
10.5 Vector 类第 3 版:动态存取属性 ...................................................................................... 237
10.6 Vector 类第 4 版:散列和快速等值测试 .......................................................................... 240
10.7 Vector 类第 5 版:格式化 .................................................................................................. 244
10.8 本章小结 ............................................................................................................................... 251
10.9 延伸阅读 ............................................................................................................................... 251
第 11 章 接口:从协议到抽象基类 .......................................................................................... 256
11.1 Python 文化中的接口和协议 ............................................................................................... 257
11.2 Python 喜欢序列 ................................................................................................................... 258
11.3 使用猴子补丁在运行时实现协议 ....................................................................................... 260
11.4 Alex Martelli 的水禽 ............................................................................................................ 262
11.5 定义抽象基类的子类 ........................................................................................................... 266
11.6 标准库中的抽象基类 ........................................................................................................... 267
11.6.1 collections.abc 模块中的抽象基类 ................................................................... 267
11.6.2 抽象基类的数字塔 ................................................................................................. 269
11.7 定义并使用一个抽象基类 ................................................................................................... 270
11.7.1 抽象基类句法详解 ................................................................................................. 273
11.7.2 定义 Tombola 抽象基类的子类 .............................................................................. 274
11.7.3 Tombola 的虚拟子类 ............................................................................................... 276
11.8 Tombola 子类的测试方法 .................................................................................................... 278
11.9 Python 使用 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
目录 | xiii
第 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.1 Sentence 类第 1 版:单词序列 .......................................................................................... 331
14.2 可迭代的对象与迭代器的对比 ........................................................................................... 334
14.3 Sentence 类第 2 版:典型的迭代器 .................................................................................. 337
14.4 Sentence 类第 3 版:生成器函数 ...................................................................................... 339
14.5 Sentence 类第 4 版:惰性实现 .......................................................................................... 343
14.6 Sentence 类第 5 版:生成器表达式 .................................................................................. 344
14.7 何时使用生成器表达式 ....................................................................................................... 345
14.8 另一个示例:等差数列生成器 ........................................................................................... 346
14.9 标准库中的生成器函数 ....................................................................................................... 349
14.10 Python 3.3 中新出现的句法: yield from ....................................................................... 357
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.3 contextlib 模块中的实用工具 ........................................................................................... 374
15.4 使用 @contextmanager ......................................................................................................... 375
15.5 本章小结 ............................................................................................................................... 378
15.6 延伸阅读 ............................................................................................................................... 378
xiv | 目录
第 16 章 协程 .................................................................................................................................. 381
16.1 生成器如何进化成协程 ....................................................................................................... 382
16.2 用作协程的生成器的基本行为 ........................................................................................... 382
16.3 示例:使用协程计算移动平均值 ....................................................................................... 385
16.4 预激协程的装饰器 ............................................................................................................... 386
16.5 终止协程和异常处理 ........................................................................................................... 388
16.6 让协程返回值 ....................................................................................................................... 391
16.7 使用 yield from ................................................................................................................... 393
16.8 yield from 的意义 ............................................................................................................... 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 和 GIL ................................................................................................................ 424
17.3 使用 concurrent.futures 模块启动进程 .......................................................................... 424
17.4 实验 Executor.map 方法 ...................................................................................................... 426
17.5 显示下载进度并处理错误 ................................................................................................... 429
17.5.1 flags2 系列示例处理错误的方式 ........................................................................ 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.1 asyncio.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
目录 |
xv
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.1 LineItem 类第 1 版:表示订单中商品的类 ......................................................... 498
19.2.2 LineItem 类第 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.1 LineItem 类第 3 版:一个简单的描述符 ............................................................. 515
20.1.2 LineItem 类第 4 版:自动获取储存属性的名称 ................................................. 519
20.1.3 LineItem 类第 5 版:一种新型描述符 ................................................................. 524
xvi | 目录
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