流暢的Python 致力于幫助Python開發人員挖掘這門語言及相關程序庫的品質特性,避免重復勞動,同時寫出簡潔、流暢、易讀、易維護,并且具有地道Python風格的代碼。流暢的Python 尤其深入探討了Python語言的高級用法,涵蓋數據結構、Python風格的對象、并行與并發,以及元編程等不同的方面。
流暢的Python 由奮戰在Python開發一線近20年的Luciano Ramalho執筆,Victor Stinner、Alex Martelli等Python大咖擔綱技術審稿人,從語言設計層面剖析編程細節,兼顧Python 3和Python 2,告訴你Python中不親自動手實踐就無法理解的語言陷阱成因和解決之道,教你寫出風格地道的Python代碼。 ● Python數據模型:理解為什么特殊方法是對象行為一致的關鍵。 ● 數據結構:充分利用內置類型,理解Unicode文本和字節二象性。 ● 把函數視作對象:把Python函數視作一等對象,并了解這一點對流行的設計模式的影響。 ● 面向對象習慣用法:通過構建類學習引用、可變性、接口、運算符重載和多重繼承。 ● 控制流程:學習使用上下文管理器、生成器、協程,以及通過concurrent.futures和asyncio包實現的并發。 ● 元編程:理解特性、描述符、類裝飾器和元類的工作原理。
Luciano Ramalho,從1998年起就成為了Python程序員。他是Python軟件基金會的成員,Python.pro.br(巴西的一家培訓公司)的共同所有者,還是巴西diyi個眾創空間Garoa Hacker Clube的聯合創始人。他領導過多個軟件開發團隊,還在巴西的媒體、銀行和政府部門教授Python課程。 [譯者簡介] 安道 專注于現代計算機技術的自由翻譯,譯有《Flask Web 開發》《Python 網絡編程攻略》《Ruby on Rails 教程》等書。 個人網站:http: about.ac 。 吳珂 現為Airbnb公司軟件工程師,所在團隊主要負責開發和維護各類可伸縮、高性能服務,并在Airbnb內推廣面向服務的系統架構。在分布式系統、云存儲服務和跨平臺SDK開發,以及大規模數據處理等方面有多年經驗。
前言 xvii
及時部分序幕
第1 章 Python 數據模型2
1.1一摞 Python 風格的紙牌3
1.2如何使用特殊方法6
1.2.1模擬數值類型7
1.2.2字符串表示形式9
1.2.3算術運算符10
1.2.4自定義的布爾值10
1.3特殊方法一覽10
1.4為什么 len 不是普通方法12
1.5本章小結12
1.6延伸閱讀13
第二部分數據結構
第2 章 序列構成的數組16
2.1內置序列類型概覽17
2.2列表推導和生成器表達式18
2.2.1列表推導和可讀性18
2.2.2列表推導同 filter 和 map 的比較20
2.2.3笛卡兒積20
2.2.4生成器表達式21
2.3元組不僅僅是不可變的列表22
2.3.1元組和記錄23
2.3.2元組拆包23
2.3.3嵌套元組拆包25
2.3.4具名元組26
2.3.5作為不可變列表的元組27
2.4切片28
2.4.1為什么切片和區間會忽略一個元素28
2.4.2對對象進行切片29
2.4.3多維切片和省略30
2.4.4給切片賦值31
2.5對序列使用 和 31
2.6序列的增量賦值33
2.7list.sort 方法和內置函數 sorted36
2.8用 bisect 來管理已排序的序列37
2.8.1用 bisect 來搜索38
2.8.2用 bisect.insort 插入新元素40
2.9當列表不是時41
2.9.1數組41
2.9.2內存視圖44
2.9.3NumPy 和 SciPy45
2.9.4雙向隊列和其他形式的隊列47
2.10本章小結49
2.11延伸閱讀50
第3 章 字典和集合54
3.1泛映射類型54
3.2字典推導56
3.3常見的映射方法57
3.4映射的彈性鍵查詢61
3.4.1defaultdict :處理找不到的鍵的一個選擇61
3.4.2特殊方法 __missing__62
3.5字典的變種65
3.6子類化 UserDict65
3.7不可變映射類型67
3.8集合論68
3.8.1集合字面量69
3.8.2集合推導71
3.8.3集合的操作71
3.9dict 和 set 的背后73
3.9.1一個關于效率的實驗74
3.9.2字典中的散列表75
3.9.3dict 的實現及其導致的結果78
3.9.4set 的實現以及導致的結果80
3.10本章小結80
3.11延伸閱讀81
第4 章 文本和字節序列83
4.1字符問題84
4.2字節概要85
4.3基本的編解碼器88
4.4了解編解碼問題89
4.4.1處理 UnicodeEncodeError90
4.4.2處理 UnicodeDecodeError90
4.4.3使用預期之外的編碼加載模塊時拋出的 SyntaxError91
4.4.4如何找出字節序列的編碼92
4.4.5BOM:有用的鬼符93
4.5處理文本文件94
4.6為了正確比較而規范化 Unicode 字符串99
4.6.1大小寫折疊101
4.6.2規范化文本匹配實用函數102
4.6.3極端“規范化”:去掉變音符號103
4.7Unicode 文本排序105
4.8Unicode 數據庫108
4.9支持字符串和字節序列的雙模式 API109
4.9.1正則表達式中的字符串和字節序列109
4.9.2os 函數中的字符串和字節序列111
4.10本章小結112
4.11延伸閱讀113
第三部分把函數視作對象
第5 章 一等函數118
5.1把函數視作對象119
5.2高階函數120
5.3匿名函數122
5.4可調用對象122
5.5用戶定義的可調用類型123
5.6函數內省124
5.7從定位參數到僅限關鍵字參數126
5.8獲取關于參數的信息127
5.9函數注解131
5.10支持函數式編程的包132
5.10.1operator 模塊132
5.10.2使用 functools.partial 凍結參數135
5.11本章小結137
5.12延伸閱讀137
第6 章 使用一等函數實現設計模式141
6.1案例分析:重構“策略”模式142
6.1.1經典的“策略”模式142
6.1.2使用函數實現“策略”模式145
6.1.3選擇策略:簡單的方式148
6.1.4找出模塊中的全部策略149
6.2“命令”模式150
6.3本章小結151
6.4延伸閱讀152
第7 章 函數裝飾器和閉包154
7.1裝飾器基礎知識155
7.2Python 何時執行裝飾器156
7.3使用裝飾器改進“策略”模式157
7.4變量作用域規則159
7.5閉包161
7.6nonlocal 聲明164
7.7實現一個簡單的裝飾器165
7.8標準庫中的裝飾器168
7.8.1使用 functools.lru_cache 做備忘168
7.8.2單分派泛函數170
7.9疊放裝飾器172
7.10參數化裝飾器173
7.10.1一個參數化的注冊裝飾器173
7.10.2參數化 clock 裝飾器175
7.11本章小結177
7.12延伸閱讀178
第四部分面向對象慣用法
第8 章 對象引用、可變性和垃圾回收182
8.1變量不是盒子183
8.2標識、相等性和別名184
8.2.1在 == 和 is 之間選擇185
8.2.2元組的相對不可變性186
8.3默認做淺復制187
8.4函數的參數作為引用時190
8.4.1不要使用可變類型作為參數的默認值191
8.4.2防御可變參數193
8.5del 和垃圾回收195
8.6弱引用196
8.6.1WeakValueDictionary 簡介197
8.6.2弱引用的局限199
8.7Python 對不可變類型施加的把戲199
8.8本章小結201
8.9延伸閱讀201
第9 章 符合 Python 風格的對象205
9.1對象表示形式206
9.2再談向量類206
9.3備選構造方法208
9.4classmethod 與 staticmethod209
9.5格式化顯示210
9.6可散列的 Vector2d213
9.7Python 的私有屬性和“受保護的”屬性218
9.8使用 __slots__ 類屬性節省空間220
9.9覆蓋類屬性222
9.10本章小結224
9.11延伸閱讀225
第10 章 序列的修改、散列和切片229
10.1Vector 類:用戶定義的序列類型230
10.2Vector 類第 1 版:與 Vector2d 類兼容230
10.3協議和鴨子類型232
10.4Vector 類第 2 版:可切片的序列233
10.4.1切片原理234
10.4.2能處理切片的 __getitem__ 方法236
10.5Vector 類第 3 版:動態存取屬性237
10.6Vector 類第 4 版:散列和快速等值測試240
10.7Vector 類第 5 版:格式化244
10.8本章小結251
10.9延伸閱讀251
第11 章 接口:從協議到抽象基類256
11.1Python 文化中的接口和協議257
11.2Python 喜歡序列258
11.3使用猴子補丁在運行時實現協議260
11.4Alex Martelli 的水禽262
11.5定義抽象基類的子類266
11.6標準庫中的抽象基類267
11.6.1collections.abc 模塊中的抽象基類267
11.6.2抽象基類的數字塔269
11.7定義并使用一個抽象基類270
11.7.1抽象基類句法詳解273
11.7.2定義 Tombola 抽象基類的子類274
11.7.3Tombola 的虛擬子類276
11.8Tombola 子類的測試方法278
11.9Python 使用 register 的方式281
11.10鵝的行為有可能像鴨子281
11.11本章小結283
11.12延伸閱讀284
第12 章 繼承的優缺點289
12.1子類化內置類型很麻煩289
12.2多重繼承和方法解析順序292
12.3多重繼承的真實應用296
12.4處理多重繼承298
12.5一個現代示例:Django 通用視圖中的混入301
12.6本章小結304
12.7延伸閱讀304
第13 章 正確重載運算符307
13.1運算符重載基礎308
13.2一元運算符308
13.3重載向量加法運算符 310
13.4重載標量乘法運算符 315
13.5眾多比較運算符318
13.6增量賦值運算符321
13.7本章小結325
13.8延伸閱讀326
第五部分控制流程
第14 章 可迭代的對象、迭代器和生成器330
14.1Sentence 類第 1 版:單詞序列331
14.2可迭代的對象與迭代器的對比334
14.3Sentence 類第 2 版:典型的迭代器337
14.4Sentence 類第 3 版:生成器函數339
14.5Sentence 類第 4 版:惰性實現343
14.6Sentence 類第 5 版:生成器表達式344
14.7何時使用生成器表達式345
14.8另一個示例:等差數列生成器346
14.9標準庫中的生成器函數349
14.10Python 3.3 中新出現的句法: yield from357
14.11可迭代的歸約函數358
14.12深入分析 iter 函數359
14.13案例分析:在數據庫轉換工具中使用生成器360
14.14把生成器當成協程362
14.15本章小結362
14.16延伸閱讀363
第15 章 上下文管理器和 else 塊368
15.1先做這個,再做那個: if 語句之外的 else 塊369
15.2上下文管理器和 with 塊370
15.3contextlib 模塊中的實用工具374
15.4使用 @contextmanager375
15.5本章小結378
15.6延伸閱讀378
第16 章 協程381
16.1生成器如何進化成協程382
16.2用作協程的生成器的基本行為382
16.3示例:使用協程計算移動平均值385
16.4預激協程的裝飾器386
16.5終止協程和異常處理388
16.6讓協程返回值391
16.7使用 yield from393
16.8yield from 的意義398
16.9使用案例:使用協程做離散事件仿真403
16.9.1離散事件仿真簡介403
16.9.2出租車隊運營仿真404
16.10本章小結410
16.11延伸閱讀411
第17 章 使用期物處理并發416
17.1示例:網絡下載的三種風格416
17.1.1依序下載的腳本418
17.1.2使用 concurrent.futures 模塊下載420
17.1.3期物在哪里421
17.2阻塞型 I O 和 GIL424
17.3使用 concurrent.futures 模塊啟動進程424
17.4實驗 Executor.map 方法426
17.5顯示下載進度并處理錯誤429
17.5.1flags2 系列示例處理錯誤的方式433
17.5.2使用 futures.as_completed 函數435
17.5.3線程和多進程的替代方案437
17.6本章小結437
17.7延伸閱讀438
第18 章 使用 asyncio 包處理并發442
18.1線程與協程對比443
18.1.1asyncio.Future :故意不阻塞448
18.1.2從期物、任務和協程中產出449
18.2使用 asyncio 和 aiohttp 包下載450
18.3避免阻塞型調用454
18.4改進 asyncio 下載腳本456
18.4.1使用 asyncio.as_completed 函數456
18.4.2使用 Executor 對象,防止阻塞事件循環461
18.5從回調到期物和協程462
18.6使用 asyncio 包編寫服務器466
18.6.1使用 asyncio 包編寫 TCP 服務器467
18.6.2使用 aiohttp 包編寫 Web 服務器471
18.6.3更好地支持并發的智能客戶端474
18.7本章小結475
18.8延伸閱讀476
第六部分元編程
第19 章 動態屬性和特性482
19.1使用動態屬性轉換數據483
19.1.1使用動態屬性訪問 JSON 類數據485
19.1.2處理無效屬性名487
19.1.3使用 __new__ 方法以靈活的方式創建對象488
19.1.4使用 shelve 模塊調整 OSCON 數據源的結構490
19.1.5使用特性獲取鏈接的記錄493
19.2使用特性驗證屬性498
19.2.1LineItem 類第 1 版:表示訂單中商品的類498
19.2.2LineItem 類第 2 版:能驗證值的特性499
19.3特性全解析500
19.3.1特性會覆蓋實例屬性501
19.3.2特性的文檔503
19.4定義一個特性工廠函數504
19.5處理屬性刪除操作506
19.6處理屬性的重要屬性和函數507
19.6.1影響屬性處理方式的特殊屬性507
19.6.2處理屬性的內置函數508
19.6.3處理屬性的特殊方法509
19.7本章小結510
19.8延伸閱讀510
第20 章 屬性描述符514
20.1描述符示例:驗證屬性514
20.1.1LineItem 類第 3 版:一個簡單的描述符515
20.1.2LineItem 類第 4 版:自動獲取儲存屬性的名稱519
20.1.3LineItem 類第 5 版:一種新型描述符524
20.2覆蓋型與非覆蓋型描述符對比526
20.2.1覆蓋型描述符528
20.2.2沒有 __get__ 方法的覆蓋型描述符529
20.2.3非覆蓋型描述符530
20.2.4在類中覆蓋描述符531
20.3方法是描述符531
20.4描述符用法建議533
20.5描述符的文檔字符串和覆蓋刪除操作534
20.6本章小結535
20.7延伸閱讀536
第21 章 類元編程538
21.1類工廠函數539
21.2定制描述符的類裝飾器541
21.3導入時和運行時比較543
21.4元類基礎知識547
21.5定制描述符的元類552
21.6元類的特殊方法 __prepare__554
21.7類作為對象556
21.8本章小結557
21.9延伸閱讀557
結語560
附錄A 輔助腳本563
Python術語表588
作者簡介600
關于封面600
“很榮幸擔任這本youxiu圖書的技術審校。這本書能幫助很多中級Python程序員掌握這門語言,我也從中學到了相當多的知識!”——Alex Martelli,Python軟件基金會成員 “對于想要擴充知識的中級和高級Python程序員來說,這本書是充滿了實用編程技巧的寶藏。”——Daniel Greenfeld和Audrey Roy Greenfeld,Two Scoops of Django作者
包裝不錯。
書很少,包裝也不錯
goog.
OK OK
很不錯的書
沒啥好說的,好書。辣雞當非要湊幾個破字。
很實用...
這個商品還不錯。
???是書本身這樣,還是快遞弄得?
python的上等書籍,值得好好研讀。
適合有一定基礎的同學看
好……………
第一次知道這本書的時候,還是在stackoverflow,看到本書作者的推薦。當時還是英文Early Release版的,讀了前兩章感覺非常不錯。奈何 工作太忙,再者,英文讀起來還是有些慢,就放棄了。現在出了中文版,果斷買一本,也算是支持一下作者啦。翻譯的也還不錯,之前看過 安道 翻譯的《 flask web 開發》,感覺這個譯者也還挺靠譜。就貼書的照片了,質量還可以,當當的書老司機都懂,我也不多說了。
剛買的新書,
很好的書 適合有一定python基礎的人
進階級別的書籍
學習python的必讀
好書?。?!心血之作!??!
書是用薄膜封著的,所以沒有啥折損的,這點不錯。