
第一部分 數(shù)據(jù)結(jié)構(gòu)
第 1 章 Python 數(shù)據(jù)模型
1.1 本章新增內(nèi)容
1.2 一摞 Python 風(fēng)格的紙牌
1.3 特殊方法是如何使用的
1.3.1 模擬數(shù)值類型
1.3.2 字符串表示形式
1.3.3 自定義類型的布爾值
1.3.4 容器 API
1.4 特殊方法概述
1.5 len為什么不是方法
1.6 本章小結(jié)
1.7 延伸閱讀
第 2 章 豐富的序列
2.1 本章新增內(nèi)容
2.2 內(nèi)置序列類型概覽
2.3 列表推導(dǎo)式和生成器表達(dá)式
2.3.1 列表推導(dǎo)式對可讀性的影響
2.3.2 列表推導(dǎo)式與 map和 filter比較
2.3.3 笛卡兒積
2.3.4 生成器表達(dá)式
2.4 元組不僅僅是不可變列表
2.4.1 用作記錄
2.4.2 用作不可變列表
2.4.3 列表和元組方法的比較
2.5 序列和可迭代對象拆包
2.5.1 使用 *獲取余下的項
2.5.2 在函數(shù)調(diào)用和序列字面量中使用 *拆包
2.5.3 嵌套拆包
2.6 序列模式匹配
使用模式匹配序列實(shí)現(xiàn)一個解釋器
2.7 切片
2.7.1 為什么切片和區(qū)間排除最后一項
2.7.2 切片對象
2.7.3 多維切片和省略號
2.7.4 為切片賦值
2.8 使用 +和 *處理序列
2.8.1 構(gòu)建嵌套列表
2.8.2 使用增量賦值運(yùn)算符處理序列
2.8.3 一個 +=運(yùn)算符賦值謎題
2.9 list.sort與內(nèi)置函數(shù) sorted
2.10 當(dāng)列表不適用時
2.10.1 數(shù)組
2.10.2 memoryview
2.10.3 NumPy
2.10.4 雙端隊列和其他隊列
2.11 本章小結(jié)
2.12 延伸閱讀
第 3 章 字典和集合
3.1 本章新增內(nèi)容
3.2 字典的現(xiàn)代句法
3.2.1 字典推導(dǎo)式
3.2.2 映射拆包
3.2.3 使用 |合并映射
3.3 使用模式匹配處理映射
3.4 映射類型的標(biāo)準(zhǔn) API
3.4.1 “可哈?!敝甘裁?br/>3.4.2 常用映射方法概述
3.4.3 插入或更新可變的值
3.5 自動處理缺失的鍵
3.5.1 defaultdict:處理缺失鍵的另一種選擇
3.5.2 __missing__方法
3.5.3 標(biāo)準(zhǔn)庫對 __missing__方法的使用不一致
3.6 dict的變體
3.6.1 collections.OrderedDict
3.6.2 collections.ChainMap
3.6.3 collections.Counter
3.6.4 shelve.Shelf
3.6.5 子類應(yīng)繼承 UserDict而不是 dict
3.7 不可變映射
3.8 字典視圖
3.9 dict的實(shí)現(xiàn)方式對實(shí)踐的影響
3.10 集合論
3.10.1 set字面量
3.10.2 集合推導(dǎo)式
3.11 集合的實(shí)現(xiàn)方式對實(shí)踐的影響
集合運(yùn)算
3.12 字典視圖的集合運(yùn)算
3.13 本章小結(jié)
3.14 延伸閱讀
第 4 章 Unicode 文本和字節(jié)序列
4.1 本章新增內(nèi)容
4.2 字符問題
4.3 字節(jié)概要
4.4 基本的編碼解碼器
4.5 處理編碼和解碼問題
4.5.1 處理 UnicodeEncodeError
4.5.2 處理 UnicodeDecodeError
4.5.3 加載模塊時編碼不符合預(yù)期拋出的 SyntaxError
4.5.4 如何找出字節(jié)序列的編碼
4.5.5 BOM:有用的鬼符
4.6 處理文本文件
了解默認(rèn)編碼
4.7 為了正確比較而規(guī)范化 Unicode 字符串
4.7.1 大小寫同一化
4.7.2 規(guī)范化文本匹配的實(shí)用函數(shù)
4.7.3 極端“規(guī)范化”:去掉變音符
4.8 Unicode 文本排序
使用 Unicode 排序算法排序
4.9 Unicode 數(shù)據(jù)庫
4.9.1 按名稱查找字符
4.9.2 字符的數(shù)值意義
4.10 支持 str和 bytes的雙模式 API
4.10.1 正則表達(dá)式中的 str和 bytes
4.10.2 os函數(shù)中的 str和 bytes
4.11 本章小結(jié)
4.12 延伸閱讀
第 5 章 數(shù)據(jù)類構(gòu)建器
5.1 本章新增內(nèi)容
5.2 數(shù)據(jù)類構(gòu)建器概述
主要功能
5.3 典型的具名元組
5.4 帶類型的具名元組
5.5 類型提示入門
5.5.1 運(yùn)行時沒有作用
5.5.2 變量注解句法
5.5.3 變量注解的意義
5.6 @dataclass詳解
5.6.1 字段選項
5.6.2 初始化后處理
5.6.3 帶類型的類屬性
5.6.4 初始化不作為字段的變量
5.6.5 @dataclass示例:都柏林核心模式
5.7 數(shù)據(jù)類導(dǎo)致代碼異味
5.7.1 把數(shù)據(jù)類用作腳手架
5.7.2 把數(shù)據(jù)類用作中間表述
5.8 模式匹配類實(shí)例
5.8.1 簡單類模式
5.8.2 關(guān)鍵字類模式
5.8.3 位置類模式
5.9 本章小結(jié)
5.10 延伸閱讀
第 6 章 對象引用、可變性和垃圾回收
6.1 本章新增內(nèi)容
6.2 變量不是盒子
6.3 同一性、相等性和別名
6.3.1 在 ==和 is之間選擇
6.3.2 元組的相對不可變性
6.4 默認(rèn)做淺拷貝
為任意對象做淺拷貝和深拷貝
6.5 函數(shù)的參數(shù)是引用時
6.5.1 不要使用可變類型作為參數(shù)的默認(rèn)值
6.5.2 防御可變參數(shù)
6.6 del和垃圾回收
6.7 Python 對不可變類型施加的把戲
6.8 本章小結(jié)
6.9 延伸閱讀
第二部分 函數(shù)即對象
第 7 章 函數(shù)是一等對象
7.1 本章新增內(nèi)容
7.2 把函數(shù)視為對象
7.3 高階函數(shù)
map、filter和 reduce的現(xiàn)代替代品
7.4 匿名函數(shù)
7.5 9 種可調(diào)用對象
7.6 用戶定義的可調(diào)用類型
7.7 從位置參數(shù)到僅限關(guān)鍵字參數(shù)
僅限位置參數(shù)
7.8 支持函數(shù)式編程的包
7.8.1 operator模塊
7.8.2 使用 functools.partial凍結(jié)參數(shù)
7.9 本章小結(jié)
7.10 延伸閱讀
第 8 章 函數(shù)中的類型提示
8.1 本章新增內(nèi)容
8.2 關(guān)于漸進(jìn)式類型
8.3 漸進(jìn)式類型實(shí)踐
8.3.1 Mypy 初體驗(yàn)
8.3.2 讓 Mypy 嚴(yán)格要求
8.3.3 參數(shù)的默認(rèn)值
8.3.4 使用 None表示默認(rèn)值
8.4 類型由受支持的操作定義
8.5 注解中可用的類型
8.5.1 Any類型
8.5.2 簡單的類型和類
8.5.3 Optional類型和 Union類型
8.5.4 泛化容器
8.5.5 元組類型
8.5.6 泛化映射
8.5.7 抽象基類
8.5.8 Iterable
8.5.9 參數(shù)化泛型和 TypeVar
8.5.10 靜態(tài)協(xié)議
8.5.11 Callable
8.5.12 NoReturn
8.6 注解僅限位置參數(shù)和變長參數(shù)
8.7 類型不完美,測試須全面
8.8 本章小結(jié)
8.9 延伸閱讀
第 9 章 裝飾器和閉包
9.1 本章新增內(nèi)容
9.2 裝飾器基礎(chǔ)知識
9.3 Python 何時執(zhí)行裝飾器
9.4 注冊裝飾器
9.5 變量作用域規(guī)則
9.6 閉包
9.7 nonlocal聲明
變量查找邏輯
9.8 實(shí)現(xiàn)一個簡單的裝飾器
工作原理
9.9 標(biāo)準(zhǔn)庫中的裝飾器
9.9.1 使用 functools.cache做備忘
9.9.2 使用 lru_cache
9.9.3 單分派泛化函數(shù)
9.10 參數(shù)化裝飾器
9.10.1 一個參數(shù)化注冊裝飾器
9.10.2 參數(shù)化 clock裝飾器
9.10.3 基于類的 clock裝飾器
9.11 本章小結(jié)
9.12 延伸閱讀
第 10 章 使用一等函數(shù)實(shí)現(xiàn)設(shè)計模式
10.1 本章新增內(nèi)容
10.2 案例分析:重構(gòu)策略模式
10.2.1 經(jīng)典的策略模式
10.2.2 使用函數(shù)實(shí)現(xiàn)策略模式
10.2.3 選擇最佳策略的簡單方式
10.2.4 找出一個模塊中的全部策略
10.3 使用裝飾器改進(jìn)策略模式
10.4 命令模式
10.5 本章小結(jié)
10.6 延伸閱讀
第三部分 類和協(xié)議
第 11 章 符合 Python 風(fēng)格的對象
11.1 本章新增內(nèi)容
11.2 對象表示形式
11.3 再談向量類
11.4 備選構(gòu)造函數(shù)
11.5 classmethod與 staticmethod
11.6 格式化顯示
11.7 可哈希的 Vector2d
11.8 支持位置模式匹配
11.9 第 3 版 Vector2d的完整代碼
11.10 Python 私有屬性和“受保護(hù)”的屬性
11.11 使用 __slots__節(jié)省空間
11.11.1 簡單衡量 __slots__節(jié)省的內(nèi)存
11.11.2 總結(jié) __slots__的問題
11.12 覆蓋類屬性
11.13 本章小結(jié)
11.14 延伸閱讀
第 12 章 序列的特殊方法
12.1 本章新增內(nèi)容
12.2 Vector類:用戶定義的序列類型
12.3 Vector類第 1 版:與 Vector2d類兼容
12.4 協(xié)議和鴨子類型
12.5 Vector類第 2 版:可切片的序列
12.5.1 切片原理
12.5.2 能處理切片的 __getitem__方法
12.6 Vector類第 3 版:動態(tài)存取屬性
12.7 Vector類第 4 版:哈希和快速等值測試
12.8 Vector類第 5 版:格式化
12.9 本章小結(jié)
12.10 延伸閱讀
第 13 章 接口、協(xié)議和抽象基類
13.1 類型圖
13.2 本章新增內(nèi)容
13.3 兩種協(xié)議
13.4 利用鴨子類型編程
13.4.1 Python 喜歡序列
13.4.2 使用猴子補(bǔ)丁在運(yùn)行時實(shí)現(xiàn)協(xié)議
13.4.3 防御性編程和“快速失敗”
13.5 大鵝類型
13.5.1 子類化一個抽象基類
13.5.2 標(biāo)準(zhǔn)庫中的抽象基類
13.5.3 定義并使用一個抽象基類
13.5.4 抽象基類句法詳解
13.5.5 子類化抽象基類 Tombola
13.5.6 抽象基類的虛擬子類
13.5.7 register的實(shí)際使用
13.5.8 使用抽象基類實(shí)現(xiàn)結(jié)構(gòu)類型
13.6 靜態(tài)協(xié)議
13.6.1 為 double函數(shù)添加類型提示
13.6.2 運(yùn)行時可檢查的靜態(tài)協(xié)議
13.6.3 運(yùn)行時協(xié)議檢查的局限性
13.6.4 支持靜態(tài)協(xié)議
13.6.5 設(shè)計一個靜態(tài)協(xié)議
13.6.6 協(xié)議設(shè)計最佳實(shí)踐
13.6.7 擴(kuò)展一個協(xié)議
13.6.8 numbers模塊中的抽象基類和 Numeric 協(xié)議
13.7 本章小結(jié)
13.8 延伸閱讀
第 14 章 繼承:瑕瑜互見
14.1 本章新增內(nèi)容
14.2 super()函數(shù)
14.3 子類化內(nèi)置類型很麻煩
14.4 多重繼承和方法解析順序
14.5 混入類
不區(qū)分大小寫的映射
14.6 多重繼承的實(shí)際運(yùn)用
14.6.1 抽象基類也是混入類
14.6.2 ThreadingMixIn和 ForkingMixIn
14.6.3 Django 泛化視圖混入類
14.6.4 Tkinter 中的多重繼承
14.7 應(yīng)對多重繼承
14.7.1 優(yōu)先使用對象組合,而不是類繼承
14.7.2 理解不同情況下使用繼承的原因
14.7.3 使用抽象基類顯式表示接口
14.7.4 通過混入明確重用代碼
14.7.5 為用戶提供聚合類
14.7.6 僅子類化為子類化設(shè)計的類
14.7.7 避免子類化具體類
14.7.8 Tkinter 的好、不好以及令人厭惡的方面
14.9 本章小結(jié)
14.10 延伸閱讀
第 15 章 類型提示進(jìn)階
15.1 本章新增內(nèi)容
15.2 重載的簽名
15.2.1 重載 max函數(shù)
15.2.2 重載 max函數(shù)的啟示
15.3 TypedDict
15.4 類型校正
15.5 在運(yùn)行時讀取類型提示
15.5.1 注解在運(yùn)行時的問題
15.5.2 解決這個問題
15.6 實(shí)現(xiàn)一個泛化類
泛型基本術(shù)語
15.7 型變
15.7.1 一個不變的自動售貨機(jī)
15.7.2 一個協(xié)變的自動售貨機(jī)
15.7.3 一個逆變的垃圾桶
15.7.4 型變總結(jié)
15.8 實(shí)現(xiàn)泛化靜態(tài)協(xié)議
15.9 本章小結(jié)
15.10 延伸閱讀
第 16 章 運(yùn)算符重載
16.1 本章新增內(nèi)容
16.2 運(yùn)算符重載入門
16.3 一元運(yùn)算符
16.4 重載向量加法運(yùn)算符 +
16.5 重載標(biāo)量乘法運(yùn)算符 *
16.6 把 @當(dāng)作中綴運(yùn)算符使用
16.7 算術(shù)運(yùn)算符總結(jié)
16.8 眾多比較運(yùn)算符
16.9 增量賦值運(yùn)算符
16.10 本章小結(jié)
16.11 延伸閱讀
第四部分 控制流
第 17 章 迭代器、生成器和經(jīng)典協(xié)程
17.1 本章新增內(nèi)容
17.2 單詞序列
17.3 序列可以迭代的原因:iter函數(shù)
使用 iter處理可調(diào)用對象
17.4 可迭代對象與迭代器
17.5 為 Sentence類實(shí)現(xiàn) __iter__方法
17.5.1 Sentence類第 2 版:經(jīng)典迭代器
17.5.2 不要把可迭代對象變成迭代器
17.5.3 Sentence類第 3 版:生成器函數(shù)
17.5.4 生成器的工作原理
17.6 惰性實(shí)現(xiàn)版本
17.6.1 Sentence類第 4 版:惰性生成器
17.6.2 Sentence類第 5 版:惰性生成器表達(dá)式
17.7 何時使用生成器表達(dá)式
17.8 一個等差數(shù)列生成器
使用 itertools模塊生成等差數(shù)列
17.9 標(biāo)準(zhǔn)庫中的生成器函數(shù)
17.10 可迭代的歸約函數(shù)
17.11 yield from:從子生成器中產(chǎn)出
17.11.1 重新實(shí)現(xiàn) chain
17.11.2 遍歷樹狀結(jié)構(gòu)
17.12 泛化可迭代類型
17.13 經(jīng)典協(xié)程
17.13.1 示例:使用協(xié)程計算累計平均值
17.13.2 讓協(xié)程返回一個值
17.13.3 經(jīng)典協(xié)程的泛化類型提示
17.14 本章小結(jié)
17.15 延伸閱讀
第 18 章 with、match和 else塊
18.1 本章新增內(nèi)容
18.2 上下文管理器和 with塊
18.2.1 contextlib包中的實(shí)用工具
18.2.2 使用 @contextmanager
18.3 案例分析:lis.py 中的模式匹配
18.3.1 Scheme 句法
18.3.2 導(dǎo)入和類型
18.3.3 解析器
18.3.4 環(huán)境
18.3.5 REPL
18.3.6 求值函數(shù)
18.3.7 實(shí)現(xiàn)閉包的 Procedure類
18.3.8 使用 OR 模式
18.4 先做這個,再做那個:if語句之外的 else塊
18.5 本章小結(jié)
18.6 延伸閱讀
第 19 章 Python 并發(fā)模型
19.1 本章新增內(nèi)容
19.2 全景概覽
19.3 術(shù)語定義
進(jìn)程、線程和聲名狼藉的 Python GIL
19.4 一個演示并發(fā)的“Hello World”示例
19.4.1 使用線程實(shí)現(xiàn)旋轉(zhuǎn)指針
19.4.2 使用進(jìn)程實(shí)現(xiàn)旋轉(zhuǎn)指針
19.4.3 使用協(xié)程實(shí)現(xiàn)旋轉(zhuǎn)指針
19.4.4 對比幾版 supervisor函數(shù)
19.5 GIL 真正的影響
快速問答
19.6 自建進(jìn)程池
19.6.1 基于進(jìn)程的方案
19.6.2 理解用時
19.6.3 利用多核進(jìn)行素數(shù)檢測的程序代碼
19.6.4 實(shí)驗(yàn):進(jìn)程數(shù)多一些或少一些
19.6.5 基于線程的方案并不可靠
19.7 多核世界中的 Python
19.7.1 系統(tǒng)管理
19.7.2 數(shù)據(jù)科學(xué)
19.7.3 服務(wù)器端 Web 和移動開發(fā)
19.7.4 WSGI 應(yīng)用程序服務(wù)器
19.7.5 分布式任務(wù)隊列
19.8 本章小結(jié)
19.9 延伸閱讀
19.9.1 使用線程和進(jìn)程實(shí)現(xiàn)并發(fā)
19.9.2 GIL
19.9.3 標(biāo)準(zhǔn)庫之外的并發(fā)世界
19.9.4 Python 之外的并發(fā)和伸縮世界
第 20 章 并發(fā)執(zhí)行器
20.1 本章新增內(nèi)容
20.2 并發(fā)網(wǎng)絡(luò)下載
20.2.1 依序下載的腳本
20.2.2 使用 concurrent.futures模塊下載
20.2.3 future 對象在哪里
20.3 使用 concurrent.futures啟動進(jìn)程
重寫多核版素數(shù)檢測程序
20.4 實(shí)驗(yàn) Executor.map方法
20.5 顯示下載進(jìn)度并處理錯誤
20.5.1 flags2 系列示例處理錯誤的方式
20.5.2 使用 futures.as_completed函數(shù)
20.6 本章小結(jié)
20.7 延伸閱讀
第 21 章 異步編程
21.1 本章新增內(nèi)容
21.2 一些定義
21.3 一個 asyncio示例:探測域名
Guido 閱讀異步代碼的技巧
21.4 新概念:可異步調(diào)用對象
21.5 使用 asyncio和 HTTPX 下載
21.5.1 原生協(xié)程的秘密:默默無聞的生成器
21.5.2 “不成功便成仁”問題
21.6 異步上下文管理器
21.7 增強(qiáng) asyncio版下載腳本的功能
21.7.1 使用 asyncio.as_completed和一個線程
21.7.2 使用信號量限制請求
21.7.3 每次下載發(fā)起多個請求
21.8 把任務(wù)委托給執(zhí)行器
21.9 使用 asyncio編寫服務(wù)器
21.9.1 一個 FastAPI Web 服務(wù)
21.9.2 一個使用 asyncio編寫的 TCP 服務(wù)器
21.10 異步迭代和異步可迭代對象
21.10.1 異步生成器函數(shù)
21.10.2 異步生成器表達(dá)式和異步推導(dǎo)式
21.11 asyncio之外的異步世界:Curio
21.12 異步對象的類型提示
21.13 異步原理與陷阱
21.13.1 阻塞型調(diào)用導(dǎo)致漫長等待
21.13.2 I/O 密集型系統(tǒng)的誤區(qū)
21.13.3 繞開 CPU 密集型陷阱
21.14 本章小結(jié)
21.15 延伸閱讀
第五部分 元編程
第 22 章 動態(tài)屬性和特性
22.1 本章新增內(nèi)容
22.2 使用動態(tài)屬性轉(zhuǎn)換數(shù)據(jù)
22.2.1 使用動態(tài)屬性訪問 JSON 類數(shù)據(jù)
22.2.2 處理無效屬性名
22.2.3 使用 __new__方法靈活創(chuàng)建對象
22.3 計算特性
22.3.1 第 1 步:數(shù)據(jù)驅(qū)動屬性創(chuàng)建
22.3.2 第 2 步:通過特性獲取鏈接的記錄
22.3.3 第 3 步:用特性覆蓋現(xiàn)有屬性
22.3.4 第 4 步:自己實(shí)現(xiàn)特性緩存
22.3.5 第 5 步:使用 functools緩存特性
22.4 使用特性驗(yàn)證屬性
22.4.1 LineItem類第 1 版:表示訂單中商品的類
22.4.2 LineItem類第 2 版:能驗(yàn)證值的特性
22.5 特性全解析
22.5.1 特性覆蓋實(shí)例屬性
22.5.2 特性的文檔
22.6 定義一個特性工廠函數(shù)
22.7 處理屬性刪除操作
22.8 處理屬性的重要屬性和函數(shù)
22.8.1 影響屬性處理方式的特殊屬性
22.8.2 處理屬性的內(nèi)置函數(shù)
22.8.3 處理屬性的特殊方法
22.9 本章小結(jié)
22.10 延伸閱讀
第 23 章 屬性描述符
23.1 本章新增內(nèi)容
23.2 描述符示例:屬性驗(yàn)證
23.2.1 LineItem類第 3 版:一個簡單的描述符
23.2.2 LineItem類第 4 版:為儲存屬性自動命名
23.2.3 LineItem類第 5 版:一種新型描述符
23.3 覆蓋型描述符與非覆蓋型描述符對比
23.3.1 覆蓋型描述符
23.3.2 沒有 __get__方法的覆蓋型描述符
23.3.3 非覆蓋型描述符
23.3.4 覆蓋類中的描述符
23.4 方法是描述符
23.5 描述符用法建議
23.6 描述符的文檔字符串和覆蓋刪除操作
23.7 本章小結(jié)
23.8 延伸閱讀
第 24 章 類元編程
24.1 本章新增內(nèi)容
24.2 身為對象的類
24.3 type:內(nèi)置的類工廠函數(shù)
24.4 類工廠函數(shù)
24.5 引出 __init_subclass__
為什么 __init_subclass__不能配置 __slots__
24.6 使用類裝飾器增強(qiáng)類的功能
24.7 導(dǎo)入時和運(yùn)行時比較
求解時間實(shí)驗(yàn)
24.8 元類入門