作 者:(巴西)盧西亞諾·拉馬略 著 安道 譯
定 價:199.8
出 版 社:人民郵電出版社
出版日期:2023年04月01日
頁 數:772
裝 幀:平裝
ISBN:9787115612366
一、領域好書【領域好書】Python 進階指南,精通 Python 繞不開的推薦作品【好評如潮】 4.7 星評,豆瓣評分 9.4,近 8 萬讀者學習【作者資深】25 年一線研發經驗,PSF(Python軟件基金會)成員二、內容精良【知識聚焦】專注 Python 核心特性和標準庫,助你掌握語言底層邏輯【通俗易讀】近 500 段代碼示例 + 多圖多表,文筆詼諧,語言流暢【Pythonic】寫簡潔、流暢、地道的 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容器API12
1.4特殊方法概述13
1.5len為什麼不是方法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
組不僅僅是不可變列表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.9list.sort與內置函數sorted45
2.10當列表不適用時46
2.10.1數組47
2.10.2memoryview49
2.10.3NumPy50
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映射類型的標準API64
3.4.1“可哈希”指什麼64
3.4.2常用映射方法概述65
3.4.3插入或更新可變的值67
3.5自動處理缺失的鍵69
3.5.1defaultdict:處理缺失鍵的另一種選擇69
3.5.2__missing__方法70
3.5.3標準庫對__missing__方法的使用不一致72
3.6dict的變體73
3.6.1collections.OrderedDict73
3.6.2collections.ChainMap73
3.6.3collections.Counter74
3.6.4shelve.Shelf74
3.6.5子類應繼承UserDict而不是dict75
3.7不可變映射76
3.8字典視圖77
3.9dict的實現方式對實踐的影響78
3.10集合論79
3.10.1set字面量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處理UnicodeEncodeError94
4.5.2處理UnicodeDecodeError95
4.5.3加載模塊時編碼不符合預期拋出的SyntaxError95
4.5.4如何找出字節序列的編碼96
4.5.5BOM:有用的鬼符97
4.6處理文本文件98
4.7為了正確比較而規範化Unicode字符串105
4.7.1大小寫同一化107
4.7.2規範化文本匹配的實用函數108
4.7.3特別“規範化”:去掉變音符109
4.8Unicode文本排序111
4.9Unicode數據庫113
4.9.1按名稱查找字符114
4.9.2字符的數值意義115
4.10支持str和bytes的雙模式API117
4.10.1正則表達式中的str和bytes117
4.10.2os函數中的str和bytes118
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.組的相對不可變性157
6.4默認做淺拷貝157
6.5函數的參數是引用時161
6.5.1不要使用可變類型作為參數的默認值162
6.5.2防御可變參數164
6.6del和垃圾回收165
6.7Python對不可變類型施加的把戲167
6.8本章小結168
6.9延伸閱讀169
第二部分函數即對像
第7章函數是一等對像175
7.1本章新增內容176
7.2把函數視為對像176
7.3高階函數177
7.4匿名函數179
7.59種可調用對像180
7.6用戶定義的可調用類型181
7.7從位置參數到僅限關鍵字參數182
7.8支持函數式編程的包184
7.8.1operator模塊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.1Mypy初體驗195
8.3.2讓Mypy嚴格要求195
8.3.3參數的默認值196
8.3.4使用None表示默認值198
8.4類型由受支持的操作定義198
8.5注解中可用的類型202
8.5.1Any類型203
8.5.2簡單的類型和類205
8.5.3Optional類型和Union類型205
8.5.4泛化容器207
8.組類型209
8.5.6泛化映射211
8.5.7抽像基類212
8.5.8Iterable214
8.5.9參數化泛型和TypeVar215
8.5.10靜態協議218
8.5.11Callable223
8.5.12NoReturn225
8.6注解僅限位置參數和變長參數225
8.7類型不完美,測試須全面226
8.8本章小結227
8.9延伸閱讀228
第9章裝飾器和閉包232
9.1本章新增內容233
9.2裝飾器基礎知識233
9.3Python何時執行裝飾器234
9.4注冊裝飾器235
9.5變量作用域規則236
9.6閉包239
9.7nonlocal聲明241
9.8實現一個簡單的裝飾器243
9.9標準庫中的裝飾器245
9.9.1使用functools.cache做備忘245
9.9.2使用lru_cache248
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.5classmethod與staticmethod283
11.6格式化顯示284
11.7可哈希的Vector2d287
11.8支持位置模式匹配289
11.9第3版Vector2d的完整代碼290
11.10Python私有屬性和“受保護”的屬性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.2Vector類:用戶定義的序列類型306
12.3Vector類第1版:與Vector2d類兼容306
12.4協議和鴨子類型308
12.5Vector類第2版:可切片的序列309
12.5.1切片原理310
12.5.2能處理切片的__getitem__方法312
12.6Vector類第3版:動態存取屬性313
12.7Vector類第4版:哈希和快速等值測試316
12.8Vector類第5版:格式化321
12.9本章小結327
12.10延伸閱讀328
第13章接口、協議和抽像基類332
13.1類型圖333
13.2本章新增內容333
13.3兩種協議334
13.4利用鴨子類型編程335
13.4.1Python喜歡序列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子類化抽像基類Tombola352
13.5.6抽像基類的虛擬子類354
13.5.7register的實際使用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.8numbers模塊中的抽像基類和Numeric協議367
13.7本章小結369
13.8延伸閱讀370
第14章繼承:瑕瑜互見374
14.1本章新增內容375
14.2super()函數375
14.3子類化內置類型很麻煩377
14.4多重繼承和方法解析順序379
14.5混入類384
14.6多重繼承的實際運用385
14.6.1抽像基類也是混入類386
14.6.2ThreadingMixIn和ForkingMixIn386
14.6.3Django泛化視圖混入類387
14.6.4Tkinter中的多重繼承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.8Tkinter的好、不好以及令人厭惡的方面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.3TypedDict405
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運算符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
《流暢的Python.下冊》
第四部分控制流
第17章迭代器、生成器和經典協程457
17.1本章新增內容458
17.2單詞序列458
17.3序列可以迭代的原因:iter函數459
17.4可迭代對像與迭代器462
17.5為Sentence類實現__iter__方法465
17.5.1Sentence類第2版:經典迭代器465
17.5.2不要把可迭代對像變成迭代器466
17.5.3Sentence類第3版:生成器函數467
17.5.4生成器的工作原理468
17.6惰性實現版本470
17.6.1Sentence類第4版:惰性生成器470
17.6.2Sentence類第5版:惰性生成器表達式471
17.7何時使用生成器表達式473
17.8一個等差數列生成器474
17.9標準庫中的生成器函數477
17.10可迭代的歸約函數486
17.11yieldfrom:從子生成器中產出487
17.11.1重新實現chain488
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.1contextlib包中的實用工具511
18.2.2使用@contextmanager512
18.3案例分析:lis.py中的模式匹配516
18.3.1Scheme句法516
18.3.2導入和類型517
18.3.3解析器518
18.3.4環境519
18.3.5REPL521
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一個演示並發的“HelloWorld”示例541
19.4.1使用線程實現旋轉指針541
19.4.2使用進程實現旋轉指針544
19.4.3使用協程實現旋轉指針545
19.4.4對比幾版supervisor函數548
19.5GIL真正的影響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多核世界中的Python559
19.7.1繫統管理560
19.7.2數據科學560
19.7.3服務器端Web和移動開發561
19.7.4WSGI應用程序服務器563
19.7.5分布式任務隊列564
19.8本章小結565
19.9延伸閱讀566
19.9.1使用線程和進程實現並發566
19.9.2GIL567
19.9.3標準庫之外的並發世界567
19.9.4Python之外的並發和伸縮世界569
第20章並發執行器572
20.1本章新增內容572
20.2並發網絡下載573
20.2.1依序下載的腳本574
20.2.2使用concurrent.futures模塊下載576
20.2.3future對像在哪裡577
20.3使用concurrent.futures啟動進程580
20.4實驗Executor.map方法583
20.5顯示下載進度並處理錯誤585
20.5.1flags2繫列示例處理錯誤的方式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一個FastAPIWeb服務614
21.9.2一個使用asyncio編寫的TCP服務器617
21.10異步迭代和異步可迭代對像622
21.10.1異步生成器函數623
21.10.2異步生成器表達式和異步推導式627
21.11asyncio之外的異步世界:Curio629
21.12異步對像的類型提示631
21.13異步原理與陷阱632
21.13.1阻塞型調用導致漫長等待633
21.13.2I/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.1LineItem類第1版:表示訂單中商品的類658
22.4.2LineItem類第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.1LineItem類第3版:一個簡單的描述符675
23.2.2LineItem類第4版:為儲存屬性自動命名680
23.2.3LineItem類第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
第2編程695
24.1本章新增內容696
24.2身為對像的類696
24.3type:內置的類工廠函數697
24.4類工廠函數698
24.5引出__init_subclass__700
24.6使用類裝飾器增強類的功能706
24.7導入時和運行時比較708
2類入門713
24.類如何定制類715
24.8.2一個類示例715
24.類求解時間實驗718
24.類實現Checked類722
24類的實際運用726
24.10.1可簡化類的現代功能726
24.1類是穩定的語言功能726
24.10.3一個類隻能類726
24.1類應作為實現細節727
24.1類的__prepare__方法實現新穎的構思727
24.12小結729
24.13本章小結730
24.14延伸閱讀730
結語733
本書是Python領域備受推崇的經典作品,致力於幫助Python開發人員挖掘這門語言及相關程序庫的優秀特性,寫出簡潔、流暢、易讀、易維護,並且地道的Python代碼。本書著重講解Python語言所獨有的功能,助你成功進階為Python高手。第2版與時俱進,教你跳出舊有經驗,探索並運用地道的Python3功能。第2版主體內容分為五部分:數據結構、函數即對像、類和協議、控編程。每一部分都精彩紛呈,通過豐富的示例和細致的講解,教你充分利用Python特性,寫出有效且現代的Python3代碼。對於所有想提升Python開發技能的讀者,本書不容錯過。
(巴西)盧西亞諾·拉馬略 著 安道 譯
【作者簡介】盧西亞諾·拉馬略(Luciano Ramalho)Thoughtworks首席咨詢師、Python軟件基金會成員、巴西Python語言學習社區Python Brasil聯合創立人。擁有25年Python編程經驗,著有編程領域作品《流暢的Python》。【譯者簡介】安道活躍的技術圖書譯者,譯有《流暢的Python》《Flask Web開發:基於Python的Web應用開發實戰》《Python網絡編程攻略》等圖書。