作者:
[巴西] Luciano Ramalho
出版社: 人民邮电出版社
出品方: 图灵教育
原作名: Fluent Python
译者: 安道
出版年: 2023-3-31
页数: 736
定价: 199.80元
装帧: 平装
丛书: 图灵程序设计丛书·Python系列
ISBN: 9787115612366
出版社: 人民邮电出版社
出品方: 图灵教育
原作名: Fluent Python
译者: 安道
出版年: 2023-3-31
页数: 736
定价: 199.80元
装帧: 平装
丛书: 图灵程序设计丛书·Python系列
ISBN: 9787115612366
内容简介 · · · · · ·
本书是 Python 领域备受推崇的经典作品,致力于帮助 Python 开发人员挖掘这门语言及相关程序库的优秀特性,写出简洁、流畅、易读、易维护,并且地道的 Python 代码。本书着重讲解 Python 语言所独有的功能,助你成功进阶为 Python 高手。
第二版与时俱进,教你跳出旧有经验,探索并运用地道的 Python 3 功能。主体内容分为五部分:数据结构、函数即对象、类和协议、控制流、元编程。每一部分都精彩纷呈,通过丰富的示例和细致的讲解,教你充分利用 Python 特性,写出有效且现代的 Python 3 代码。
作者简介 · · · · · ·
Luciano Ramalho,Thoughtworks 首席咨询师、Python 软件基金会成员、巴西知名 Python 语言学习社区 Python Brasil 联合创始人。拥有25年 Python 编程经验,著有《流畅的Python》。
目录 · · · · · ·
【上册】
前言 i
第 一部分 数据结构
第 1章 Python数据模型 3
1.1 本章新增内容 4
1.2 一摞Python风格的纸牌 4
1.3 特殊方法是如何使用的 7
1.3.1 模拟数值类型 8
1.3.2 字符串表示形式 10
1.3.3 自定义类型的布尔值 11
1.3.4 容器API 12
1.4 特殊方法概述 13
1.5 len为什么不是方法 14
1.6 本章小结 14
1.7 延伸阅读 15
第 2章 丰富的序列 17
2.1 本章新增内容 18
2.2 内置序列类型概览 18
2.3 列表推导式和生成器表达式 20
2.3.1 列表推导式对可读性的影响 20
2.3.2 列表推导式与map和filter比较 22
2.3.3 笛卡儿积 22
2.3.4 生成器表达式 23
2.4 元组不仅仅是不可变列表 24
2.4.1 用作记录 24
2.4.2 用作不可变列表 26
2.4.3 列表和元组方法的比较 27
2.5 序列和可迭代对象拆包 28
2.5.1 使用*获取余下的项 29
2.5.2 在函数调用和序列字面量中使用*拆包 29
2.5.3 嵌套拆包 30
2.6 序列模式匹配 31
2.7 切片 37
2.7.1 为什么切片和区间排除最后一项 38
2.7.2 切片对象 38
2.7.3 多维切片和省略号 39
2.7.4 为切片赋值 40
2.8 使用+和*处理序列 40
2.8.1 构建嵌套列表 41
2.8.2 使用增量赋值运算符处理序列 42
2.8.3 一个+=运算符赋值谜题 43
2.9 list.sort与内置函数sorted 45
2.10 当列表不适用时 46
2.10.1 数组 47
2.10.2 memoryview 49
2.10.3 NumPy 50
2.10.4 双端队列和其他队列 52
2.11 本章小结 55
2.12 延伸阅读 56
第3章 字典和集合 59
3.1 本章新增内容 60
3.2 字典的现代句法 60
3.2.1 字典推导式 60
3.2.2 映射拆包 61
3.2.3 使用|合并映射 61
3.3 使用模式匹配处理映射 62
3.4 映射类型的标准API 64
3.4.1 “可哈希”指什么 64
3.4.2 常用映射方法概述 65
3.4.3 插入或更新可变的值 67
3.5 自动处理缺失的键 69
3.5.1 defaultdict:处理缺失键的另一种选择 69
3.5.2 __missing__方法 70
3.5.3 标准库对__missing__方法的使用不一致 72
3.6 dict的变体 73
3.6.1 collections.OrderedDict 73
3.6.2 collections.ChainMap 73
3.6.3 collections.Counter 74
3.6.4 shelve.Shelf 74
3.6.5 子类应继承UserDict而不是dict 75
3.7 不可变映射 76
3.8 字典视图 77
3.9 dict的实现方式对实践的影响 78
3.10 集合论 79
3.10.1 set字面量 80
3.10.2 集合推导式 81
3.11 集合的实现方式对实践的影响 81
3.12 字典视图的集合运算 84
3.13 本章小结 85
3.14 延伸阅读 86
第4章 Unicode文本和字节序列 88
4.1 本章新增内容 89
4.2 字符问题 89
4.3 字节概要 90
4.4 基本的编码解码器 92
4.5 处理编码和解码问题 93
4.5.1 处理UnicodeEncodeError 94
4.5.2 处理UnicodeDecodeError 95
4.5.3 加载模块时编码不符合预期抛出的SyntaxError 95
4.5.4 如何找出字节序列的编码 96
4.5.5 BOM:有用的鬼符 97
4.6 处理文本文件 98
4.7 为了正确比较而规范化Unicode字符串 105
4.7.1 大小写同一化 107
4.7.2 规范化文本匹配的实用函数 108
4.7.3 极端“规范化”:去掉变音符 109
4.8 Unicode文本排序 111
4.9 Unicode数据库 113
4.9.1 按名称查找字符 114
4.9.2 字符的数值意义 115
4.10 支持str和bytes的双模式API 117
4.10.1 正则表达式中的str和bytes 117
4.10.2 os函数中的str和bytes 118
4.11 本章小结 119
4.12 延伸阅读 119
第5章 数据类构建器 123
5.1 本章新增内容 124
5.2 数据类构建器概述 124
5.3 典型的具名元组 128
5.4 带类型的具名元组 130
5.5 类型提示入门 131
5.5.1 运行时没有作用 131
5.5.2 变量注解句法 132
5.5.3 变量注解的意义 132
5.6 @dataclass详解 135
5.6.1 字段选项 136
5.6.2 初始化后处理 139
5.6.3 带类型的类属性 140
5.6.4 初始化不作为字段的变量 141
5.6.5 @dataclass示例:都柏林核心模式 142
5.7 数据类导致代码异味 144
5.7.1 把数据类用作脚手架 145
5.7.2 把数据类用作中间表述 145
5.8 模式匹配类实例 145
5.8.1 简单类模式 145
5.8.2 关键字类模式 146
5.8.3 位置类模式 147
5.9 本章小结 148
5.10 延伸阅读 149
第6章 对象引用、可变性和垃圾回收 152
6.1 本章新增内容 152
6.2 变量不是盒子 153
6.3 同一性、相等性和别名 154
6.3.1 在==和is之间选择 156
6.3.2 元组的相对不可变性 157
6.4 默认做浅拷贝 157
6.5 函数的参数是引用时 161
6.5.1 不要使用可变类型作为参数的默认值 162
6.5.2 防御可变参数 164
6.6 del和垃圾回收 165
6.7 Python对不可变类型施加的把戏 167
6.8 本章小结 168
6.9 延伸阅读 169
第二部分 函数即对象
第7章 函数是一等对象 175
7.1 本章新增内容 176
7.2 把函数视为对象 176
7.3 高阶函数 177
7.4 匿名函数 179
7.5 9种可调用对象 180
7.6 用户定义的可调用类型 181
7.7 从位置参数到仅限关键字参数 182
7.8 支持函数式编程的包 184
7.8.1 operator模块 184
7.8.2 使用functools.partial冻结参数 187
7.9 本章小结 189
7.10 延伸阅读 189
第8章 函数中的类型提示 192
8.1 本章新增内容 193
8.2 关于渐进式类型 193
8.3 渐进式类型实践 194
8.3.1 Mypy初体验 195
8.3.2 让Mypy严格要求 195
8.3.3 参数的默认值 196
8.3.4 使用None表示默认值 198
8.4 类型由受支持的操作定义 198
8.5 注解中可用的类型 202
8.5.1 Any类型 203
8.5.2 简单的类型和类 205
8.5.3 Optional类型和Union类型 205
8.5.4 泛化容器 207
8.5.5 元组类型 209
8.5.6 泛化映射 211
8.5.7 抽象基类 212
8.5.8 Iterable 214
8.5.9 参数化泛型和TypeVar 215
8.5.10 静态协议 218
8.5.11 Callable 223
8.5.12 NoReturn 225
8.6 注解仅限位置参数和变长参数 225
8.7 类型不完美,测试须全面 226
8.8 本章小结 227
8.9 延伸阅读 228
第9章 装饰器和闭包 232
9.1 本章新增内容 233
9.2 装饰器基础知识 233
9.3 Python何时执行装饰器 234
9.4 注册装饰器 235
9.5 变量作用域规则 236
9.6 闭包 239
9.7 nonlocal声明 241
9.8 实现一个简单的装饰器 243
9.9 标准库中的装饰器 245
9.9.1 使用functools.cache做备忘 245
9.9.2 使用lru_cache 248
9.9.3 单分派泛化函数 249
9.10 参数化装饰器 252
9.10.1 一个参数化注册装饰器 253
9.10.2 参数化clock装饰器 254
9.10.3 基于类的clock装饰器 256
9.11 本章小结 257
9.12 延伸阅读 258
第 10章 使用一等函数实现设计模式 261
10.1 本章新增内容 262
10.2 案例分析:重构策略模式 262
10.2.1 经典的策略模式 262
10.2.2 使用函数实现策略模式 265
10.2.3 选择最佳策略的简单方式 268
10.2.4 找出一个模块中的全部策略 269
10.3 使用装饰器改进策略模式 270
10.4 命令模式 272
10.5 本章小结 273
10.6 延伸阅读 274
第三部分 类和协议
第 11章 符合Python风格的对象 279
11.1 本章新增内容 280
11.2 对象表示形式 280
11.3 再谈向量类 281
11.4 备选构造函数 283
11.5 classmethod与staticmethod 283
11.6 格式化显示 284
11.7 可哈希的Vector2d 287
11.8 支持位置模式匹配 289
11.9 第3版Vector2d的完整代码 290
11.10 Python私有属性和“受保护”的属性 294
11.11 使用__slots__节省空间 295
11.11.1 简单衡量__slot__节省的内存 297
11.11.2 总结__slots__的问题 298
11.12 覆盖类属性 299
11.13 本章小结 300
11.14 延伸阅读 301
第 12章 序列的特殊方法 305
12.1 本章新增内容 305
12.2 Vector类:用户定义的序列类型 306
12.3 Vector类第 1版:与Vector2d类兼容 306
12.4 协议和鸭子类型 308
12.5 Vector类第 2版:可切片的序列 309
12.5.1 切片原理 310
12.5.2 能处理切片的__getitem__方法 312
12.6 Vector类第3版:动态存取属性 313
12.7 Vector类第4版:哈希和快速等值测试 316
12.8 Vector类第5版:格式化 321
12.9 本章小结 327
12.10 延伸阅读 328
第 13章 接口、协议和抽象基类 332
13.1 类型图 333
13.2 本章新增内容 333
13.3 两种协议 334
13.4 利用鸭子类型编程 335
13.4.1 Python喜欢序列 335
13.4.2 使用猴子补丁在运行时实现协议 337
13.4.3 防御性编程和“快速失败” 339
13.5 大鹅类型 340
13.5.1 子类化一个抽象基类 344
13.5.2 标准库中的抽象基类 345
13.5.3 定义并使用一个抽象基类 347
13.5.4 抽象基类句法详解 351
13.5.5 子类化抽象基类Tombola 352
13.5.6 抽象基类的虚拟子类 354
13.5.7 register的实际使用 356
13.5.8 使用抽象基类实现结构类型 356
13.6 静态协议 358
13.6.1 为double函数添加类型提示 358
13.6.2 运行时可检查的静态协议 359
13.6.3 运行时协议检查的局限性 362
13.6.4 支持静态协议 363
13.6.5 设计一个静态协议 364
13.6.6 协议设计最佳实践 366
13.6.7 扩展一个协议 366
13.6.8 numbers模块中的抽象基类和Numeric协议 367
13.7 本章小结 369
13.8 延伸阅读 370
第 14章 继承:瑕瑜互见 374
14.1 本章新增内容 375
14.2 super()函数 375
14.3 子类化内置类型很麻烦 377
14.4 多重继承和方法解析顺序 379
14.5 混入类 384
14.6 多重继承的实际运用 385
14.6.1 抽象基类也是混入类 386
14.6.2 ThreadingMixIn和ForkingMixIn 386
14.6.3 Django泛化视图混入类 387
14.6.4 Tkinter中的多重继承 390
14.7 应对多重继承 391
14.7.1 优先使用对象组合,而不是类继承 391
14.7.2 理解不同情况下使用继承的原因 392
14.7.3 使用抽象基类显式表示接口 392
14.7.4 通过混入明确重用代码 392
14.7.5 为用户提供聚合类 392
14.7.6 仅子类化为子类化设计的类 393
14.7.7 避免子类化具体类 393
14.7.8 Tkinter的好、不好以及令人厌恶的方面 394
14.8 本章小结 394
14.9 延伸阅读 395
第 15章 类型提示进阶 399
15.1 本章新增内容 399
15.2 重载的签名 400
15.2.1 重载max函数 401
15.2.2 重载max函数的启示 405
15.3 TypedDict 405
15.4 类型校正 411
15.5 在运行时读取类型提示 413
15.5.1 注解在运行时的问题 414
15.5.2 解决这个问题 416
15.6 实现一个泛化类 417
15.7 型变 419
15.7.1 一个不变的自动售货机 419
15.7.2 一个协变的自动售货机 421
15.7.3 一个逆变的垃圾桶 421
15.7.4 型变总结 423
15.8 实现泛化静态协议 425
15.9 本章小结 426
15.10 延伸阅读 427
第 16章 运算符重载 431
16.1 本章新增内容 432
16.2 运算符重载入门 432
16.3 一元运算符 433
16.4 重载向量加法运算符+ 435
16.5 重载标量乘法运算符* 439
16.6 把@当作中缀运算符使用 441
16.7 算术运算符总结 443
16.8 众多比较运算符 443
16.9 增量赋值运算符 446
16.10 本章小结 450
16.11 延伸阅读 451
【下册】
第四部分 控制流
第 17章 迭代器、生成器和经典协程 457
17.1 本章新增内容 458
17.2 单词序列 458
17.3 序列可以迭代的原因:iter函数 459
17.4 可迭代对象与迭代器 462
17.5 为Sentence类实现__iter__方法 465
17.5.1 Sentence类第 2版:经典迭代器 465
17.5.2 不要把可迭代对象变成迭代器 466
17.5.3 Sentence类第3版:生成器函数 467
17.5.4 生成器的工作原理 468
17.6 惰性实现版本 470
17.6.1 Sentence类第4版:惰性生成器 470
17.6.2 Sentence类第5版:惰性生成器表达式 471
17.7 何时使用生成器表达式 473
17.8 一个等差数列生成器 474
17.9 标准库中的生成器函数 477
17.10 可迭代的归约函数 486
17.11 yield from:从子生成器中产出 487
17.11.1 重新实现chain 488
17.11.2 遍历树状结构 489
17.12 泛化可迭代类型 493
17.13 经典协程 495
17.13.1 示例:使用协程计算累计平均值 496
17.13.2 让协程返回一个值 498
17.13.3 经典协程的泛化类型提示 501
17.14 本章小结 502
17.15 延伸阅读 503
第 18章 with、match和else块 507
18.1 本章新增内容 508
18.2 上下文管理器和with块 508
18.2.1 contextlib包中的实用工具 511
18.2.2 使用@contextmanager 512
18.3 案例分析:lis.py中的模式匹配 516
18.3.1 Scheme句法 516
18.3.2 导入和类型 517
18.3.3 解析器 518
18.3.4 环境 519
18.3.5 REPL 521
18.3.6 求值函数 522
18.3.7 实现闭包的Procedure 类529
18.3.8 使用OR模式 529
18.4 先做这个,再做那个:if语句之外的else块 530
18.5 本章小结 532
18.6 延伸阅读 533
第 19章 Python并发模型 537
19.1 本章新增内容 538
19.2 全景概览 538
19.3 术语定义 539
19.4 一个演示并发的“Hello World”示例 541
19.4.1 使用线程实现旋转指针 541
19.4.2 使用进程实现旋转指针 544
19.4.3 使用协程实现旋转指针 545
19.4.4 对比几版supervisor函数 548
19.5 GIL真正的影响 549
19.6 自建进程池 552
19.6.1 基于进程的方案 554
19.6.2 理解用时 554
19.6.3 利用多核进行素数检测的程序代码 555
19.6.4 实验:进程数多一些或少一些 558
19.6.5 基于线程的方案并不可靠 559
19.7 多核世界中的Python 559
19.7.1 系统管理 560
19.7.2 数据科学 560
19.7.3 服务器端Web和移动开发 561
19.7.4 WSGI应用程序服务器 563
19.7.5 分布式任务队列 564
19.8 本章小结 565
19.9 延伸阅读 566
19.9.1 使用线程和进程实现并发 566
19.9.2 GIL 567
19.9.3 标准库之外的并发世界 567
19.9.4 Python之外的并发和伸缩世界 569
第 20章 并发执行器 572
20.1 本章新增内容 572
20.2 并发网络下载 573
20.2.1 依序下载的脚本 574
20.2.2 使用concurrent.futures模块下载 576
20.2.3 future对象在哪里 577
20.3 使用concurrent.futures启动进程 580
20.4 实验Executor.map方法 583
20.5 显示下载进度并处理错误 585
20.5.1 flags2系列示例处理错误的方式 589
20.5.2 使用futures.as_completed函数 591
20.6 本章小结 593
20.7 延伸阅读 594
第 21章 异步编程 596
21.1 本章新增内容 597
21.2 一些定义 597
21.3 一个asyncio示例:探测域名 598
21.4 新概念:可异步调用对象 600
21.5 使用asyncio和HTTPX下载 601
21.5.1 原生协程的秘密:默默无闻的生成器 602
21.5.2 “不成功便成仁”问题 603
21.6 异步上下文管理器 603
21.7 增强asyncio版下载脚本的功能 605
21.7.1 使用asyncio.as_completed和一个线程 605
21.7.2 使用信号量限制请求 607
21.7.3 每次下载发起多个请求 610
21.8 把任务委托给执行器 612
21.9 使用asyncio编写服务器 613
21.9.1 一个FastAPI Web服务 614
21.9.2 一个使用asyncio编写的TCP服务器 617
21.10 异步迭代和异步可迭代对象 622
21.10.1 异步生成器函数 623
21.10.2 异步生成器表达式和异步推导式 627
21.11 asyncio之外的异步世界:Curio 629
21.12 异步对象的类型提示 631
21.13 异步原理与陷阱 632
21.13.1 阻塞型调用导致漫长等待 633
21.13.2 I/O密集型系统的误区 633
21.13.3 绕开CPU密集型陷阱 633
21.14 本章小结 634
21.15 延伸阅读 635
第五部分 元编程
第 22章 动态属性和特性 641
22.1 本章新增内容 642
22.2 使用动态属性转换数据 642
22.2.1 使用动态属性访问JSON类数据 643
22.2.2 处理无效属性名 646
22.2.3 使用__new__方法灵活创建对象 647
22.3 计算特性 649
22.3.1 第 1步:数据驱动属性创建 650
22.3.2 第 2步:通过特性获取链接的记录 651
22.3.3 第3步:用特性覆盖现有属性 654
22.3.4 第4步:自己实现特性缓存 655
22.3.5 第5步:使用functools缓存特性 656
22.4 使用特性验证属性 658
22.4.1 LineItem类第 1版:表示订单中商品的类 658
22.4.2 LineItem类第 2版:能验证值的特性 659
22.5 特性全解析 660
22.5.1 特性覆盖实例属性 661
22.5.2 特性的文档 663
22.6 定义一个特性工厂函数 664
22.7 处理属性删除操作 666
22.8 处理属性的重要属性和函数 667
22.8.1 影响属性处理方式的特殊属性 667
22.8.2 处理属性的内置函数 668
22.8.3 处理属性的特殊方法 668
22.9 本章小结 669
22.10 延伸阅读 670
第 23章 属性描述符 674
23.1 本章新增内容 675
23.2 描述符示例:属性验证 675
23.2.1 LineItem类第3版:一个简单的描述符 675
23.2.2 LineItem类第4版:为储存属性自动命名 680
23.2.3 LineItem类第5版:一种新型描述符 681
23.3 覆盖型描述符与非覆盖型描述符对比 683
23.3.1 覆盖型描述符 685
23.3.2 没有__get__方法的覆盖型描述符 686
23.3.3 非覆盖型描述符 687
23.3.4 覆盖类中的描述符 687
23.4 方法是描述符 688
23.5 描述符用法建议 690
23.6 描述符的文档字符串和覆盖删除操作 691
23.7 本章小结 692
23.8 延伸阅读 692
第 24章 类元编程 695
24.1 本章新增内容 696
24.2 身为对象的类 696
24.3 type:内置的类工厂函数 697
24.4 类工厂函数 698
24.5 引出__init_subclass__ 700
24.6 使用类装饰器增强类的功能 706
24.7 导入时和运行时比较 708
24.8 元类入门 713
24.8.1 元类如何定制类 715
24.8.2 一个友好的元类示例 715
24.8.3 元类求解时间实验 718
24.9 使用元类实现Checked类 722
24.10 元类的实际运用 726
24.10.1 可简化或代替元类的现代功能 726
24.10.2 元类是稳定的语言功能 726
24.10.3 一个类只能有一个元类 726
24.10.4 元类应作为实现细节 727
24.11 使用元类的__prepare__方法实现新颖的构思 727
24.12 小结 729
24.13 本章小结 730
24.14 延伸阅读 730
结语 733
· · · · · · (收起)
前言 i
第 一部分 数据结构
第 1章 Python数据模型 3
1.1 本章新增内容 4
1.2 一摞Python风格的纸牌 4
1.3 特殊方法是如何使用的 7
1.3.1 模拟数值类型 8
1.3.2 字符串表示形式 10
1.3.3 自定义类型的布尔值 11
1.3.4 容器API 12
1.4 特殊方法概述 13
1.5 len为什么不是方法 14
1.6 本章小结 14
1.7 延伸阅读 15
第 2章 丰富的序列 17
2.1 本章新增内容 18
2.2 内置序列类型概览 18
2.3 列表推导式和生成器表达式 20
2.3.1 列表推导式对可读性的影响 20
2.3.2 列表推导式与map和filter比较 22
2.3.3 笛卡儿积 22
2.3.4 生成器表达式 23
2.4 元组不仅仅是不可变列表 24
2.4.1 用作记录 24
2.4.2 用作不可变列表 26
2.4.3 列表和元组方法的比较 27
2.5 序列和可迭代对象拆包 28
2.5.1 使用*获取余下的项 29
2.5.2 在函数调用和序列字面量中使用*拆包 29
2.5.3 嵌套拆包 30
2.6 序列模式匹配 31
2.7 切片 37
2.7.1 为什么切片和区间排除最后一项 38
2.7.2 切片对象 38
2.7.3 多维切片和省略号 39
2.7.4 为切片赋值 40
2.8 使用+和*处理序列 40
2.8.1 构建嵌套列表 41
2.8.2 使用增量赋值运算符处理序列 42
2.8.3 一个+=运算符赋值谜题 43
2.9 list.sort与内置函数sorted 45
2.10 当列表不适用时 46
2.10.1 数组 47
2.10.2 memoryview 49
2.10.3 NumPy 50
2.10.4 双端队列和其他队列 52
2.11 本章小结 55
2.12 延伸阅读 56
第3章 字典和集合 59
3.1 本章新增内容 60
3.2 字典的现代句法 60
3.2.1 字典推导式 60
3.2.2 映射拆包 61
3.2.3 使用|合并映射 61
3.3 使用模式匹配处理映射 62
3.4 映射类型的标准API 64
3.4.1 “可哈希”指什么 64
3.4.2 常用映射方法概述 65
3.4.3 插入或更新可变的值 67
3.5 自动处理缺失的键 69
3.5.1 defaultdict:处理缺失键的另一种选择 69
3.5.2 __missing__方法 70
3.5.3 标准库对__missing__方法的使用不一致 72
3.6 dict的变体 73
3.6.1 collections.OrderedDict 73
3.6.2 collections.ChainMap 73
3.6.3 collections.Counter 74
3.6.4 shelve.Shelf 74
3.6.5 子类应继承UserDict而不是dict 75
3.7 不可变映射 76
3.8 字典视图 77
3.9 dict的实现方式对实践的影响 78
3.10 集合论 79
3.10.1 set字面量 80
3.10.2 集合推导式 81
3.11 集合的实现方式对实践的影响 81
3.12 字典视图的集合运算 84
3.13 本章小结 85
3.14 延伸阅读 86
第4章 Unicode文本和字节序列 88
4.1 本章新增内容 89
4.2 字符问题 89
4.3 字节概要 90
4.4 基本的编码解码器 92
4.5 处理编码和解码问题 93
4.5.1 处理UnicodeEncodeError 94
4.5.2 处理UnicodeDecodeError 95
4.5.3 加载模块时编码不符合预期抛出的SyntaxError 95
4.5.4 如何找出字节序列的编码 96
4.5.5 BOM:有用的鬼符 97
4.6 处理文本文件 98
4.7 为了正确比较而规范化Unicode字符串 105
4.7.1 大小写同一化 107
4.7.2 规范化文本匹配的实用函数 108
4.7.3 极端“规范化”:去掉变音符 109
4.8 Unicode文本排序 111
4.9 Unicode数据库 113
4.9.1 按名称查找字符 114
4.9.2 字符的数值意义 115
4.10 支持str和bytes的双模式API 117
4.10.1 正则表达式中的str和bytes 117
4.10.2 os函数中的str和bytes 118
4.11 本章小结 119
4.12 延伸阅读 119
第5章 数据类构建器 123
5.1 本章新增内容 124
5.2 数据类构建器概述 124
5.3 典型的具名元组 128
5.4 带类型的具名元组 130
5.5 类型提示入门 131
5.5.1 运行时没有作用 131
5.5.2 变量注解句法 132
5.5.3 变量注解的意义 132
5.6 @dataclass详解 135
5.6.1 字段选项 136
5.6.2 初始化后处理 139
5.6.3 带类型的类属性 140
5.6.4 初始化不作为字段的变量 141
5.6.5 @dataclass示例:都柏林核心模式 142
5.7 数据类导致代码异味 144
5.7.1 把数据类用作脚手架 145
5.7.2 把数据类用作中间表述 145
5.8 模式匹配类实例 145
5.8.1 简单类模式 145
5.8.2 关键字类模式 146
5.8.3 位置类模式 147
5.9 本章小结 148
5.10 延伸阅读 149
第6章 对象引用、可变性和垃圾回收 152
6.1 本章新增内容 152
6.2 变量不是盒子 153
6.3 同一性、相等性和别名 154
6.3.1 在==和is之间选择 156
6.3.2 元组的相对不可变性 157
6.4 默认做浅拷贝 157
6.5 函数的参数是引用时 161
6.5.1 不要使用可变类型作为参数的默认值 162
6.5.2 防御可变参数 164
6.6 del和垃圾回收 165
6.7 Python对不可变类型施加的把戏 167
6.8 本章小结 168
6.9 延伸阅读 169
第二部分 函数即对象
第7章 函数是一等对象 175
7.1 本章新增内容 176
7.2 把函数视为对象 176
7.3 高阶函数 177
7.4 匿名函数 179
7.5 9种可调用对象 180
7.6 用户定义的可调用类型 181
7.7 从位置参数到仅限关键字参数 182
7.8 支持函数式编程的包 184
7.8.1 operator模块 184
7.8.2 使用functools.partial冻结参数 187
7.9 本章小结 189
7.10 延伸阅读 189
第8章 函数中的类型提示 192
8.1 本章新增内容 193
8.2 关于渐进式类型 193
8.3 渐进式类型实践 194
8.3.1 Mypy初体验 195
8.3.2 让Mypy严格要求 195
8.3.3 参数的默认值 196
8.3.4 使用None表示默认值 198
8.4 类型由受支持的操作定义 198
8.5 注解中可用的类型 202
8.5.1 Any类型 203
8.5.2 简单的类型和类 205
8.5.3 Optional类型和Union类型 205
8.5.4 泛化容器 207
8.5.5 元组类型 209
8.5.6 泛化映射 211
8.5.7 抽象基类 212
8.5.8 Iterable 214
8.5.9 参数化泛型和TypeVar 215
8.5.10 静态协议 218
8.5.11 Callable 223
8.5.12 NoReturn 225
8.6 注解仅限位置参数和变长参数 225
8.7 类型不完美,测试须全面 226
8.8 本章小结 227
8.9 延伸阅读 228
第9章 装饰器和闭包 232
9.1 本章新增内容 233
9.2 装饰器基础知识 233
9.3 Python何时执行装饰器 234
9.4 注册装饰器 235
9.5 变量作用域规则 236
9.6 闭包 239
9.7 nonlocal声明 241
9.8 实现一个简单的装饰器 243
9.9 标准库中的装饰器 245
9.9.1 使用functools.cache做备忘 245
9.9.2 使用lru_cache 248
9.9.3 单分派泛化函数 249
9.10 参数化装饰器 252
9.10.1 一个参数化注册装饰器 253
9.10.2 参数化clock装饰器 254
9.10.3 基于类的clock装饰器 256
9.11 本章小结 257
9.12 延伸阅读 258
第 10章 使用一等函数实现设计模式 261
10.1 本章新增内容 262
10.2 案例分析:重构策略模式 262
10.2.1 经典的策略模式 262
10.2.2 使用函数实现策略模式 265
10.2.3 选择最佳策略的简单方式 268
10.2.4 找出一个模块中的全部策略 269
10.3 使用装饰器改进策略模式 270
10.4 命令模式 272
10.5 本章小结 273
10.6 延伸阅读 274
第三部分 类和协议
第 11章 符合Python风格的对象 279
11.1 本章新增内容 280
11.2 对象表示形式 280
11.3 再谈向量类 281
11.4 备选构造函数 283
11.5 classmethod与staticmethod 283
11.6 格式化显示 284
11.7 可哈希的Vector2d 287
11.8 支持位置模式匹配 289
11.9 第3版Vector2d的完整代码 290
11.10 Python私有属性和“受保护”的属性 294
11.11 使用__slots__节省空间 295
11.11.1 简单衡量__slot__节省的内存 297
11.11.2 总结__slots__的问题 298
11.12 覆盖类属性 299
11.13 本章小结 300
11.14 延伸阅读 301
第 12章 序列的特殊方法 305
12.1 本章新增内容 305
12.2 Vector类:用户定义的序列类型 306
12.3 Vector类第 1版:与Vector2d类兼容 306
12.4 协议和鸭子类型 308
12.5 Vector类第 2版:可切片的序列 309
12.5.1 切片原理 310
12.5.2 能处理切片的__getitem__方法 312
12.6 Vector类第3版:动态存取属性 313
12.7 Vector类第4版:哈希和快速等值测试 316
12.8 Vector类第5版:格式化 321
12.9 本章小结 327
12.10 延伸阅读 328
第 13章 接口、协议和抽象基类 332
13.1 类型图 333
13.2 本章新增内容 333
13.3 两种协议 334
13.4 利用鸭子类型编程 335
13.4.1 Python喜欢序列 335
13.4.2 使用猴子补丁在运行时实现协议 337
13.4.3 防御性编程和“快速失败” 339
13.5 大鹅类型 340
13.5.1 子类化一个抽象基类 344
13.5.2 标准库中的抽象基类 345
13.5.3 定义并使用一个抽象基类 347
13.5.4 抽象基类句法详解 351
13.5.5 子类化抽象基类Tombola 352
13.5.6 抽象基类的虚拟子类 354
13.5.7 register的实际使用 356
13.5.8 使用抽象基类实现结构类型 356
13.6 静态协议 358
13.6.1 为double函数添加类型提示 358
13.6.2 运行时可检查的静态协议 359
13.6.3 运行时协议检查的局限性 362
13.6.4 支持静态协议 363
13.6.5 设计一个静态协议 364
13.6.6 协议设计最佳实践 366
13.6.7 扩展一个协议 366
13.6.8 numbers模块中的抽象基类和Numeric协议 367
13.7 本章小结 369
13.8 延伸阅读 370
第 14章 继承:瑕瑜互见 374
14.1 本章新增内容 375
14.2 super()函数 375
14.3 子类化内置类型很麻烦 377
14.4 多重继承和方法解析顺序 379
14.5 混入类 384
14.6 多重继承的实际运用 385
14.6.1 抽象基类也是混入类 386
14.6.2 ThreadingMixIn和ForkingMixIn 386
14.6.3 Django泛化视图混入类 387
14.6.4 Tkinter中的多重继承 390
14.7 应对多重继承 391
14.7.1 优先使用对象组合,而不是类继承 391
14.7.2 理解不同情况下使用继承的原因 392
14.7.3 使用抽象基类显式表示接口 392
14.7.4 通过混入明确重用代码 392
14.7.5 为用户提供聚合类 392
14.7.6 仅子类化为子类化设计的类 393
14.7.7 避免子类化具体类 393
14.7.8 Tkinter的好、不好以及令人厌恶的方面 394
14.8 本章小结 394
14.9 延伸阅读 395
第 15章 类型提示进阶 399
15.1 本章新增内容 399
15.2 重载的签名 400
15.2.1 重载max函数 401
15.2.2 重载max函数的启示 405
15.3 TypedDict 405
15.4 类型校正 411
15.5 在运行时读取类型提示 413
15.5.1 注解在运行时的问题 414
15.5.2 解决这个问题 416
15.6 实现一个泛化类 417
15.7 型变 419
15.7.1 一个不变的自动售货机 419
15.7.2 一个协变的自动售货机 421
15.7.3 一个逆变的垃圾桶 421
15.7.4 型变总结 423
15.8 实现泛化静态协议 425
15.9 本章小结 426
15.10 延伸阅读 427
第 16章 运算符重载 431
16.1 本章新增内容 432
16.2 运算符重载入门 432
16.3 一元运算符 433
16.4 重载向量加法运算符+ 435
16.5 重载标量乘法运算符* 439
16.6 把@当作中缀运算符使用 441
16.7 算术运算符总结 443
16.8 众多比较运算符 443
16.9 增量赋值运算符 446
16.10 本章小结 450
16.11 延伸阅读 451
【下册】
第四部分 控制流
第 17章 迭代器、生成器和经典协程 457
17.1 本章新增内容 458
17.2 单词序列 458
17.3 序列可以迭代的原因:iter函数 459
17.4 可迭代对象与迭代器 462
17.5 为Sentence类实现__iter__方法 465
17.5.1 Sentence类第 2版:经典迭代器 465
17.5.2 不要把可迭代对象变成迭代器 466
17.5.3 Sentence类第3版:生成器函数 467
17.5.4 生成器的工作原理 468
17.6 惰性实现版本 470
17.6.1 Sentence类第4版:惰性生成器 470
17.6.2 Sentence类第5版:惰性生成器表达式 471
17.7 何时使用生成器表达式 473
17.8 一个等差数列生成器 474
17.9 标准库中的生成器函数 477
17.10 可迭代的归约函数 486
17.11 yield from:从子生成器中产出 487
17.11.1 重新实现chain 488
17.11.2 遍历树状结构 489
17.12 泛化可迭代类型 493
17.13 经典协程 495
17.13.1 示例:使用协程计算累计平均值 496
17.13.2 让协程返回一个值 498
17.13.3 经典协程的泛化类型提示 501
17.14 本章小结 502
17.15 延伸阅读 503
第 18章 with、match和else块 507
18.1 本章新增内容 508
18.2 上下文管理器和with块 508
18.2.1 contextlib包中的实用工具 511
18.2.2 使用@contextmanager 512
18.3 案例分析:lis.py中的模式匹配 516
18.3.1 Scheme句法 516
18.3.2 导入和类型 517
18.3.3 解析器 518
18.3.4 环境 519
18.3.5 REPL 521
18.3.6 求值函数 522
18.3.7 实现闭包的Procedure 类529
18.3.8 使用OR模式 529
18.4 先做这个,再做那个:if语句之外的else块 530
18.5 本章小结 532
18.6 延伸阅读 533
第 19章 Python并发模型 537
19.1 本章新增内容 538
19.2 全景概览 538
19.3 术语定义 539
19.4 一个演示并发的“Hello World”示例 541
19.4.1 使用线程实现旋转指针 541
19.4.2 使用进程实现旋转指针 544
19.4.3 使用协程实现旋转指针 545
19.4.4 对比几版supervisor函数 548
19.5 GIL真正的影响 549
19.6 自建进程池 552
19.6.1 基于进程的方案 554
19.6.2 理解用时 554
19.6.3 利用多核进行素数检测的程序代码 555
19.6.4 实验:进程数多一些或少一些 558
19.6.5 基于线程的方案并不可靠 559
19.7 多核世界中的Python 559
19.7.1 系统管理 560
19.7.2 数据科学 560
19.7.3 服务器端Web和移动开发 561
19.7.4 WSGI应用程序服务器 563
19.7.5 分布式任务队列 564
19.8 本章小结 565
19.9 延伸阅读 566
19.9.1 使用线程和进程实现并发 566
19.9.2 GIL 567
19.9.3 标准库之外的并发世界 567
19.9.4 Python之外的并发和伸缩世界 569
第 20章 并发执行器 572
20.1 本章新增内容 572
20.2 并发网络下载 573
20.2.1 依序下载的脚本 574
20.2.2 使用concurrent.futures模块下载 576
20.2.3 future对象在哪里 577
20.3 使用concurrent.futures启动进程 580
20.4 实验Executor.map方法 583
20.5 显示下载进度并处理错误 585
20.5.1 flags2系列示例处理错误的方式 589
20.5.2 使用futures.as_completed函数 591
20.6 本章小结 593
20.7 延伸阅读 594
第 21章 异步编程 596
21.1 本章新增内容 597
21.2 一些定义 597
21.3 一个asyncio示例:探测域名 598
21.4 新概念:可异步调用对象 600
21.5 使用asyncio和HTTPX下载 601
21.5.1 原生协程的秘密:默默无闻的生成器 602
21.5.2 “不成功便成仁”问题 603
21.6 异步上下文管理器 603
21.7 增强asyncio版下载脚本的功能 605
21.7.1 使用asyncio.as_completed和一个线程 605
21.7.2 使用信号量限制请求 607
21.7.3 每次下载发起多个请求 610
21.8 把任务委托给执行器 612
21.9 使用asyncio编写服务器 613
21.9.1 一个FastAPI Web服务 614
21.9.2 一个使用asyncio编写的TCP服务器 617
21.10 异步迭代和异步可迭代对象 622
21.10.1 异步生成器函数 623
21.10.2 异步生成器表达式和异步推导式 627
21.11 asyncio之外的异步世界:Curio 629
21.12 异步对象的类型提示 631
21.13 异步原理与陷阱 632
21.13.1 阻塞型调用导致漫长等待 633
21.13.2 I/O密集型系统的误区 633
21.13.3 绕开CPU密集型陷阱 633
21.14 本章小结 634
21.15 延伸阅读 635
第五部分 元编程
第 22章 动态属性和特性 641
22.1 本章新增内容 642
22.2 使用动态属性转换数据 642
22.2.1 使用动态属性访问JSON类数据 643
22.2.2 处理无效属性名 646
22.2.3 使用__new__方法灵活创建对象 647
22.3 计算特性 649
22.3.1 第 1步:数据驱动属性创建 650
22.3.2 第 2步:通过特性获取链接的记录 651
22.3.3 第3步:用特性覆盖现有属性 654
22.3.4 第4步:自己实现特性缓存 655
22.3.5 第5步:使用functools缓存特性 656
22.4 使用特性验证属性 658
22.4.1 LineItem类第 1版:表示订单中商品的类 658
22.4.2 LineItem类第 2版:能验证值的特性 659
22.5 特性全解析 660
22.5.1 特性覆盖实例属性 661
22.5.2 特性的文档 663
22.6 定义一个特性工厂函数 664
22.7 处理属性删除操作 666
22.8 处理属性的重要属性和函数 667
22.8.1 影响属性处理方式的特殊属性 667
22.8.2 处理属性的内置函数 668
22.8.3 处理属性的特殊方法 668
22.9 本章小结 669
22.10 延伸阅读 670
第 23章 属性描述符 674
23.1 本章新增内容 675
23.2 描述符示例:属性验证 675
23.2.1 LineItem类第3版:一个简单的描述符 675
23.2.2 LineItem类第4版:为储存属性自动命名 680
23.2.3 LineItem类第5版:一种新型描述符 681
23.3 覆盖型描述符与非覆盖型描述符对比 683
23.3.1 覆盖型描述符 685
23.3.2 没有__get__方法的覆盖型描述符 686
23.3.3 非覆盖型描述符 687
23.3.4 覆盖类中的描述符 687
23.4 方法是描述符 688
23.5 描述符用法建议 690
23.6 描述符的文档字符串和覆盖删除操作 691
23.7 本章小结 692
23.8 延伸阅读 692
第 24章 类元编程 695
24.1 本章新增内容 696
24.2 身为对象的类 696
24.3 type:内置的类工厂函数 697
24.4 类工厂函数 698
24.5 引出__init_subclass__ 700
24.6 使用类装饰器增强类的功能 706
24.7 导入时和运行时比较 708
24.8 元类入门 713
24.8.1 元类如何定制类 715
24.8.2 一个友好的元类示例 715
24.8.3 元类求解时间实验 718
24.9 使用元类实现Checked类 722
24.10 元类的实际运用 726
24.10.1 可简化或代替元类的现代功能 726
24.10.2 元类是稳定的语言功能 726
24.10.3 一个类只能有一个元类 726
24.10.4 元类应作为实现细节 727
24.11 使用元类的__prepare__方法实现新颖的构思 727
24.12 小结 729
24.13 本章小结 730
24.14 延伸阅读 730
结语 733
· · · · · · (收起)
丛书信息
· · · · · ·
图灵程序设计丛书·Python系列(共54册),
这套丛书还有
《Python机器学习经典实例》《Python数据分析》《Python计算机视觉编程》《NumPy攻略》《Python参考手册(第4版)》
等
。
喜欢读"流畅的Python(第2版)"的人也喜欢的电子书 · · · · · ·
支持 Web、iPhone、iPad、Android 阅读器
喜欢读"流畅的Python(第2版)"的人也喜欢 · · · · · ·
- 大模型应用开发极简入门 6.9
- Python深度学习 (第2版) 9.5
- C程序设计语言 (原书第2版) 9.6
- 编程珠玑(第2版) 9.1
- Flask Web开发 8.4
- 算法详解(卷1)——算法基础 9.0
流畅的Python(第2版)的书评 · · · · · · ( 全部 25 条 )
如果只推荐一本Python书,我要Pick它!
这篇书评可能有关键情节透露
今年二月初,我偶然看到了一条推特: 《流畅的Python》一书的作者发布了一条激动人心的消息:他正在写作第二版! 如果要票选最佳的 Python 进阶类书目,这本书肯定会是得票率最高的书籍之一。我在最早写“Python猫荐书系列”时,就想推荐它,但又觉得好东西应该留到最后,所以... (展开)Python进阶好书
本人是统计背景,日常使用python只局限于数据科学领域,平时也用python来处理boring things。时常对python机制和特性感到好奇。 花费了大约100小时阅读了本书的前16章,学到了很多基础的python思想。阅读之后可以利用书中的知识来优化自己的代码,更好地实现自己的想法,更高效...
(展开)
为数不多的Python进阶好书
Python如今已是异常火爆,这本书是给入门Python语言之后,想进一步学习Python的同学准备的。难能可贵的是,本书花了大量篇幅,通过许多例子深入讲解了文本编码、迭代器与生成器,协程,并发程序设计,元编程等诸多实用且对新人有难度的知识点,需要读者反复阅读理解相关章节。 ...
(展开)
> 更多书评 25篇
论坛 · · · · · ·
翻译的超级烂 | 来自OnTheRoad | 9 回应 | 2024-04-08 21:19:09 |
中文版毁了一部经典作品 | 来自OnTheRoad | 2024-04-05 06:31:57 | |
翻译的人快切腹------------------ | 来自Elias | 1 回应 | 2024-03-31 17:57:30 |
恭喜图灵把这本书刷到了9.0分,真不害臊 | 来自Autumn-one | 2024-01-24 13:38:20 | |
屎一样的翻译水平 | 来自OnTheRoad | 1 回应 | 2024-01-24 13:34:44 |
> 浏览更多话题
这本书的其他版本 · · · · · · ( 全部7 )
-
人民邮电出版社 (2017)9.3分 1010人读过
-
O'Reilly Media (2015)9.6分 310人读过
-
O'Reilly Media, Inc. (2021)9.2分 51人读过
-
东南大学出版社 (2017)9.7分 24人读过
以下书单推荐 · · · · · · ( 全部 )
- 幽暗之境:编程与黑客序列 (Azeril)
- 编程语言大观 (𝕾𝖚𝖓)
- Python (李鼎)
- T (dhcn)
- 安道翻译的书 (安道)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
订阅关于流畅的Python(第2版)的评论:
feed: rss 2.0
1 有用 雨腥 2024-07-05 11:20:44 浙江
翻译简直一坨大便
5 有用 子桓 2023-06-18 18:18:19 福建
翻译极其垃圾,跟第一版的翻译完全比不了。不知道这么好的畅销书图灵会让这么翻译。真的是越来越不行了。
12 有用 浮乎 2023-07-04 21:23:55 广东
如此稀碎的行文能写出流畅的Python???
0 有用 Qfwfq 2024-04-09 22:04:26 广东
翻译真的太烂了,同样的内容第一版讲得更清晰。
0 有用 eyon cai 2023-07-27 07:55:49 福建
了解了一些原理,实例代码也很生动。就是翻译看着有点累
0 有用 均可Drink 2024-08-06 13:51:59 浙江
翻译的确捉急
0 有用 杰克豹 2024-07-22 23:31:06 江苏
耗时十六小时,终于读完这本经典的第二版!第二版依旧是神作!人生苦短,我用 Python。这话依然成立!
1 有用 Evrins Hu 2024-07-13 19:09:00 浙江
第 20 章有一个下载国旗图片的例子, 中文版把地址换成了 mp.ituring.com.cn/files 直接返回 404 , 没想好怎么维护就不要改, 自作聪明
1 有用 雨腥 2024-07-05 11:20:44 浙江
翻译简直一坨大便
0 有用 Qfwfq 2024-04-09 22:04:26 广东
翻译真的太烂了,同样的内容第一版讲得更清晰。