流暢的 Python, 2/e Fluent Python: Clear, Concise, and Effective Programming, 2/e
[巴西]盧西亞諾·拉馬略(Luciano Ramalho)
- 出版商: 人民郵電
- 出版日期: 2023-04-01
- 定價: $1,199
- 售價: 7.5 折 $899
- 語言: 簡體中文
- 頁數: 736
- ISBN: 7115612366
- ISBN-13: 9787115612366
-
相關分類:
Python、Python
- 此書翻譯自: Fluent Python: Clear, Concise, and Effective Programming, 2/e (Paperback)
-
相關翻譯:
流暢的 Python|清晰、簡潔、高效的程式設計, 2/e (Fluent Python: Clear, Concise, and Effective Programming, 2/e) (繁中版)
立即出貨(限量) (庫存=7)
買這商品的人也買了...
-
Eclipse 完全攻略-從基礎 Java 到 PDE 外掛開發$600$468 -
Real-Time Communication with WebRTC: Peer-to-Peer in the Browser (Paperback)$1,100$1,045 -
Docker 錦囊妙計 (Docker Cookbook)$680$537 -
$1,890A Programmer's Guide to Java SE 8 Oracle Certified Associate (OCA) -
$1,519Fundamentals of Database Systems, 7/e (IE-Paperback) -
深入理解 Android 內核設計思想, 2/e (上下冊)$948$901 -
演算法圖鑑:26種演算法 + 7種資料結構,人工智慧、數據分析、邏輯思考的原理和應用 step by step 全圖解$450$356 -
資訊與網路安全概論:進入區塊鏈世界, 6/e$780$741 -
$708Boost 程序庫完全開發指南 ― 深入 C++ ”準”標準庫, 5/e -
GAN 對抗式生成網路 (GANs in Action: Deep learning with Generative Adversarial Networks)$750$593 -
$659奔跑吧 Linux 內核 (捲1):基礎架構, 2/e -
FPGA 進階開發與實踐$648$616 -
$611奔跑吧 Linux 內核入門篇, 2/e -
$521奔跑吧 Linux 內核 (捲2):調試與案例分析, 2/e -
資料科學的建模基礎 : 別急著 coding!你知道模型的陷阱嗎?$599$509 -
$690MATLAB 2020 信號處理從入門到精通 -
資料科學的統計實務 : 探索資料本質、扎實解讀數據,才是機器學習成功建模的第一步$599$509 -
$1,015嵌入式系統實戰指南:面向 IoT 應用 -
既會用也了解:最新一代 5G 核心技術加強版 (過版書特價)$1,200$840 -
嵌入式系統多任務處理應用開發實戰:基於 ARM MCU 和 FreeRTOS 內核$894$849 -
原子嵌入式 Linux 驅動開發詳解與實戰 (ARM Linux 驅動)$1,068$1,015 -
$1,673Java 官方編程手冊, 12/e (Java 17) -
流暢的 C|設計原則、實踐和模式 (Fluent C: Principles, Practices, and Patterns)$680$537 -
語音辨識:模式、演算法設計與實踐$594$564 -
Vibe Coding CLI 頂級開發 - Claude Code 前瞻菁英育成手冊$1,080$853
簡體館年度書展|現貨2書79折3書75折 詳見活動內容 »
-
VIP 95折
深入淺出 SSD 測試 : 固態存儲測試流程 方法與工具$594$564 -
VIP 95折
MCP 開發從入門到實戰$515$489 -
85折
$806Linux x64 匯編語言編程 -
VIP 95折
MCP 極簡開發 : 輕鬆打造高效智能體$479$455 -
VIP 95折
RISC-V 架構 DSP 處理器設計$534$507 -
VIP 95折
硬件系統模糊測試:技術揭秘與案例剖析$419$398 -
85折
$454RAG 實踐權威指南:構建精準、高效大模型之道 -
VIP 95折
CUDA 並行編程與性能優化$714$678 -
VIP 95折
生成式視覺模型原理與實踐$288$274 -
87折
$459AI大模型:賦能通信產業 -
VIP 95折
科學預測——預見科學之美$408$388 -
VIP 95折
Processing創意編程入門:從編程原理到項目案例$299$284 -
VIP 95折
大模型驅動的具身智能 架構,設計與實現$534$507 -
VIP 95折
納米級CMOS VLSI電路(可制造性設計)$474$450 -
VIP 95折
Manus應用與AI Agent設計指南:從入門到精通$359$341 -
87折
$360高薪Offer 簡歷、面試、談薪完全攻略 -
VIP 95折
軟件系統優化$534$507 -
87折
$360芯片的較量 (日美半導體風雲) -
VIP 95折
Manus AI 智能體從入門到精通$294$279 -
87折
$981深度學習:基礎與概念 -
85折
$505GitHub Copilot 編程指南 -
79折
$425Cursor 與 Copilot 開發實戰 : 讓煩瑣編程智能化 -
85折
$551C#核心編程200例(視頻課程+全套源程序) -
VIP 95折
Verilog HDL計算機網絡典型電路算法設計與實現$354$336 -
VIP 95折
SAAS + AI 架構實戰:業務解析、架構設計、AI 應用$708$673
簡體館年度書展|現貨2書79折3書75折 詳見活動內容 »
-
85折
$806Linux x64 匯編語言編程 -
VIP 95折
MCP 極簡開發 : 輕鬆打造高效智能體$479$455 -
VIP 95折
RISC-V 架構 DSP 處理器設計$534$507 -
VIP 95折
硬件系統模糊測試:技術揭秘與案例剖析$419$398 -
85折
$454RAG 實踐權威指南:構建精準、高效大模型之道 -
VIP 95折
生成式視覺模型原理與實踐$288$274 -
87折
$459AI大模型:賦能通信產業 -
VIP 95折
科學預測——預見科學之美$408$388 -
VIP 95折
Processing創意編程入門:從編程原理到項目案例$299$284 -
87折
$360高薪Offer 簡歷、面試、談薪完全攻略 -
VIP 95折
軟件系統優化$534$507 -
87折
$360芯片的較量 (日美半導體風雲) -
85折
$505GitHub Copilot 編程指南 -
85折
$551C#核心編程200例(視頻課程+全套源程序) -
VIP 95折
SAAS + AI 架構實戰:業務解析、架構設計、AI 應用$708$673 -
VIP 95折
深入淺出 Docker, 2/e$419$398 -
85折
$658Unity 特效制作:Shader Graph 案例精講 -
79折
$275零基礎玩轉國產大模型DeepSeek -
VIP 95折
人工智能大模型:機器學習基礎$774$735 -
VIP 95折
RAG 極簡入門:原理與實踐$419$398 -
VIP 95折
大模型實戰 : 從零實現 RAG 與 Agent 系統$419$398 -
VIP 95折
算法趣學(第2版)$348$331 -
VIP 95折
大模型理論與實踐——打造行業智能助手$354$336 -
VIP 95折
大模型應用開發 RAG 實戰課$599$569 -
85折
$509生成式人工智能 (基於 PyTorch 實現)
相關主題
商品描述
本書是Python領域備受推崇的經典作品,致力於幫助Python開發人員挖掘這門語言及相關程序庫的優秀特性,寫出簡潔、流暢、易讀、易維護,並且地道的Python代碼。本書著重講解Python語言所獨有的功能,助你成功進階為Python高手。第2版與時俱進,教你跳出舊有經驗,探索並運用地道的Python 3功能。第2版主體內容分為五部分:數據結構、函數即對象、類和協議、控制流、元編程。每一部分都精彩紛呈,通過豐富的示例和細致的講解,教你充分利用Python特性,寫出有效且現代的Python 3代碼。
作者簡介
【作者簡介】
盧西亞諾·拉馬略(Luciano Ramalho)
Thoughtworks首席咨詢師、Python軟件基金會成員、巴西Python語言學習社區Python Brasil聯合創立人。擁有25年Python編程經驗,著有編程領域作品《流暢的Python》。
【譯者簡介】
安道
活躍的技術圖書譯者,譯有《流暢的Python》《Flask Web開發:基於Python的Web應用開發實戰》《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


