内容
本书是Python领域备受推崇的经典作品,致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,写出简洁、流畅、易读、易维护,并且地道的Python代码。本书着重讲解Python语言所独有的功能,助你成功进阶为Python高手。第2版与时俱进,教你跳出旧有经验,探索并运用地道的Python 3功能。第2版主体内容分为五部分:数据结构、函数即对象、类和协议、控制流、元编程。每一部分都精彩纷呈,通过丰富的示例和细致的讲解,教你充分利用Python特性,写出有效且现代的Python 3代码。
作者
Luciano Ramalho,Thoughtworks 首席咨询师、Python 软件基金会成员、巴西知名 Python 语言学习社区 Python Brasil 联合创始人。拥有25年 Python 编程经验,著有《流畅的Python》。
目录
【上册】
前言 i
第 1章 Python数据模型 3
1.2 一摞Python风格的纸牌 4
1.3.1 模拟数值类型 8
1.3.3 自定义类型的布尔值 11
1.4 特殊方法概述 13
1.6 本章小结 14
第 2章 丰富的序列 17
2.2 内置序列类型概览 18
2.3.1 列表推导式对可读性的影响 20
2.3.3 笛卡儿积 22
2.4 元组不仅仅是不可变列表 24
2.4.2 用作不可变列表 26
2.5 序列和可迭代对象拆包 28
2.5.2 在函数调用和序列字面量中使用*拆包 29
2.6 序列模式匹配 31
2.7.1 为什么切片和区间排除最后一项 38
2.7.3 多维切片和省略号 39
2.8 使用+和*处理序列 40
2.8.2 使用增量赋值运算符处理序列 42
2.9 list.sort与内置函数sorted 45
2.10.1 数组 47
2.10.3 NumPy 50
2.11 本章小结 55
第3章 字典和集合 59
3.2 字典的现代句法 60
3.2.2 映射拆包 61
3.3 使用模式匹配处理映射 62
3.4.1 “可哈希”指什么 64
3.4.3 插入或更新可变的值 67
3.5.1 defaultdict:处理缺失键的另一种选择 69
3.5.3 标准库对__missing__方法的使用不一致 72
3.6.1 collections.OrderedDict 73
3.6.3 collections.Counter 74
3.6.5 子类应继承UserDict而不是dict 75
3.8 字典视图 77
3.10 集合论 79
3.10.2 集合推导式 81
3.12 字典视图的集合运算 84
3.14 延伸阅读 86
4.1 本章新增内容 89
4.3 字节概要 90
4.5 处理编码和解码问题 93
4.5.2 处理UnicodeDecodeError 95
4.5.4 如何找出字节序列的编码 96
4.6 处理文本文件 98
4.7.1 大小写同一化 107
4.7.3 极端“规范化”:去掉变音符 109
4.9 Unicode数据库 113
4.9.2 字符的数值意义 115
4.10.1 正则表达式中的str和bytes 117
4.11 本章小结 119
第5章 数据类构建器 123
5.2 数据类构建器概述 124
5.4 带类型的具名元组 130
5.5.1 运行时没有作用 131
5.5.3 变量注解的意义 132
5.6.1 字段选项 136
5.6.3 带类型的类属性 140
5.6.5 @dataclass示例:都柏林核心模式 142
5.7.1 把数据类用作脚手架 145
5.8 模式匹配类实例 145
5.8.2 关键字类模式 146
5.9 本章小结 148
第6章 对象引用、可变性和垃圾回收 152
6.2 变量不是盒子 153
6.3.1 在==和is之间选择 156
6.4 默认做浅拷贝 157
6.5.1 不要使用可变类型作为参数的默认值 162
6.6 del和垃圾回收 165
6.8 本章小结 168
第二部分 函数即对象
7.1 本章新增内容 176
7.3 高阶函数 177
7.5 9种可调用对象 180
7.7 从位置参数到仅限关键字参数 182
7.8.1 operator模块 184
7.9 本章小结 189
第8章 函数中的类型提示 192
8.2 关于渐进式类型 193
8.3.1 Mypy初体验 195
8.3.3 参数的默认值 196
8.4 类型由受支持的操作定义 198
8.5.1 Any类型 203
8.5.3 Optional类型和Union类型 205
8.5.5 元组类型 209
8.5.7 抽象基类 212
8.5.9 参数化泛型和TypeVar 215
8.5.11 Callable 223
8.6 注解仅限位置参数和变长参数 225
8.8 本章小结 227
第9章 装饰器和闭包 232
9.2 装饰器基础知识 233
9.4 注册装饰器 235
9.6 闭包 239
9.8 实现一个简单的装饰器 243
9.9.1 使用functools.cache做备忘 245
9.9.3 单分派泛化函数 249
9.10.1 一个参数化注册装饰器 253
9.10.3 基于类的clock装饰器 256
9.12 延伸阅读 258
10.1 本章新增内容 262
10.2.1 经典的策略模式 262
10.2.3 选择最佳策略的简单方式 268
10.3 使用装饰器改进策略模式 270
10.5 本章小结 273
第三部分 类和协议
11.1 本章新增内容 280
11.3 再谈向量类 281
11.5 classmethod与staticmethod 283
11.7 可哈希的Vector2d 287
11.9 第3版Vector2d的完整代码 290
11.11 使用__slots__节省空间 295
11.11.2 总结__slots__的问题 298
11.13 本章小结 300
第 12章 序列的特殊方法 305
12.2 Vector类:用户定义的序列类型 306
12.4 协议和鸭子类型 308
12.5.1 切片原理 310
12.6 Vector类第3版:动态存取属性 313
12.8 Vector类第5版:格式化 321
12.10 延伸阅读 328
13.1 类型图 333
13.3 两种协议 334
13.4.1 Python喜欢序列 335
13.4.3 防御性编程和“快速失败” 339
13.5.1 子类化一个抽象基类 344
13.5.3 定义并使用一个抽象基类 347
13.5.5 子类化抽象基类Tombola 352
13.5.7 register的实际使用 356
13.6 静态协议 358
13.6.2 运行时可检查的静态协议 359
13.6.4 支持静态协议 363
13.6.6 协议设计最佳实践 366
13.6.8 numbers模块中的抽象基类和Numeric协议 367
13.8 延伸阅读 370
14.1 本章新增内容 375
14.3 子类化内置类型很麻烦 377
14.5 混入类 384
14.6.1 抽象基类也是混入类 386
14.6.3 Django泛化视图混入类 387
14.7 应对多重继承 391
14.7.2 理解不同情况下使用继承的原因 392
14.7.4 通过混入明确重用代码 392
14.7.6 仅子类化为子类化设计的类 393
14.7.8 Tkinter的好、不好以及令人厌恶的方面 394
14.9 延伸阅读 395
15.1 本章新增内容 399
15.2.1 重载max函数 401
15.3 TypedDict 405
15.5 在运行时读取类型提示 413
15.5.2 解决这个问题 416
15.7 型变 419
15.7.2 一个协变的自动售货机 421
15.7.4 型变总结 423
15.9 本章小结 426
第 16章 运算符重载 431
16.2 运算符重载入门 432
16.4 重载向量加法运算符+ 435
16.6 把@当作中缀运算符使用 441
16.8 众多比较运算符 443
16.10 本章小结 450
【下册】
第 17章 迭代器、生成器和经典协程 457
17.2 单词序列 458
17.4 可迭代对象与迭代器 462
17.5.1 Sentence类第 2版:经典迭代器 465
17.5.3 Sentence类第3版:生成器函数 467
17.6 惰性实现版本 470
17.6.2 Sentence类第5版:惰性生成器表达式 471
17.8 一个等差数列生成器 474
17.10 可迭代的归约函数 486
17.11.1 重新实现chain 488
17.12 泛化可迭代类型 493
17.13.1 示例:使用协程计算累计平均值 496
17.13.3 经典协程的泛化类型提示 501
17.15 延伸阅读 503
18.1 本章新增内容 508
18.2.1 contextlib包中的实用工具 511
18.3 案例分析:lis.py中的模式匹配 516
18.3.2 导入和类型 517
18.3.4 环境 519
18.3.6 求值函数 522
18.3.8 使用OR模式 529
18.5 本章小结 532
第 19章 Python并发模型 537
19.2 全景概览 538
19.4 一个演示并发的“Hello World”示例 541
19.4.2 使用进程实现旋转指针 544
19.4.4 对比几版supervisor函数 548
19.6 自建进程池 552
19.6.2 理解用时 554
19.6.4 实验:进程数多一些或少一些 558
19.7 多核世界中的Python 559
19.7.2 数据科学 560
19.7.4 WSGI应用程序服务器 563
19.8 本章小结 565
19.9.1 使用线程和进程实现并发 566
19.9.3 标准库之外的并发世界 567
第 20章 并发执行器 572
20.2 并发网络下载 573
20.2.2 使用concurrent.futures模块下载 576
20.3 使用concurrent.futures启动进程 580
20.5 显示下载进度并处理错误 585
20.5.2 使用futures.as_completed函数 591
20.7 延伸阅读 594
21.1 本章新增内容 597
21.3 一个asyncio示例:探测域名 598
21.5 使用asyncio和HTTPX下载 601
21.5.2 “不成功便成仁”问题 603
21.7 增强asyncio版下载脚本的功能 605
21.7.2 使用信号量限制请求 607
21.8 把任务委托给执行器 612
21.9.1 一个FastAPI Web服务 614
21.10 异步迭代和异步可迭代对象 622
21.10.2 异步生成器表达式和异步推导式 627
21.12 异步对象的类型提示 631
21.13.1 阻塞型调用导致漫长等待 633
21.13.3 绕开CPU密集型陷阱 633
21.15 延伸阅读 635
第 22章 动态属性和特性 641
22.2 使用动态属性转换数据 642
22.2.2 处理无效属性名 646
22.3 计算特性 649
22.3.2 第 2步:通过特性获取链接的记录 651
22.3.4 第4步:自己实现特性缓存 655
22.4 使用特性验证属性 658
22.4.2 LineItem类第 2版:能验证值的特性 659
22.5.1 特性覆盖实例属性 661
22.6 定义一个特性工厂函数 664
22.8 处理属性的重要属性和函数 667
22.8.2 处理属性的内置函数 668
22.9 本章小结 669
第 23章 属性描述符 674
23.2 描述符示例:属性验证 675
23.2.2 LineItem类第4版:为储存属性自动命名 680
23.3 覆盖型描述符与非覆盖型描述符对比 683
23.3.2 没有__get__方法的覆盖型描述符 686
23.3.4 覆盖类中的描述符 687
23.5 描述符用法建议 690
23.7 本章小结 692
第 24章 类元编程 695
24.2 身为对象的类 696
24.4 类工厂函数 698
24.6 使用类装饰器增强类的功能 706
24.8 元类入门 713
24.8.2 一个友好的元类示例 715
24.9 使用元类实现Checked类 722
24.10.1 可简化或代替元类的现代功能 726
24.10.3 一个类只能有一个元类 726
24.11 使用元类的__prepare__方法实现新颖的构思 727
24.13 本章小结 730
结语 733