《流暢的Python(第2版)》是2023年人民郵電出版社出版的圖書,作者是[巴西] 盧西亞諾·拉馬略(Luciano Ramalho)。
基本介紹
- 中文名:流暢的Python(第2版)
- 作者:[巴西] 盧西亞諾·拉馬略(Luciano Ramalho)
- 出版時間:2023年4月
- 出版社:人民郵電出版社
- ISBN:9787115612366
- 開本:16 開
- 裝幀:平裝
內容簡介,作者簡介,圖書目錄,
內容簡介
本書是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