流暢的 Python, 2/e Fluent Python: Clear, Concise, and Effective Programming, 2/e

[巴西]盧西亞諾·拉馬略(Luciano Ramalho)

  • 流暢的 Python, 2/e-preview-1
  • 流暢的 Python, 2/e-preview-2
流暢的 Python, 2/e-preview-1

買這商品的人也買了...

簡體館年度書展|現貨2書79折3書75折 詳見活動內容 »

簡體館年度書展|現貨2書79折3書75折 詳見活動內容 »

相關主題

商品描述

本書是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