Python編程從新手到高手
[美] 賈森·C.麥克唐納(Jason C. McDonald)
- 出版商: 人民郵電
- 出版日期: 2025-07-01
- 售價: $719
- 語言: 簡體中文
- 頁數: 530
- ISBN: 7115659745
- ISBN-13: 9787115659743
-
相關分類:
Python
- 此書翻譯自: Dead Simple Python: Idiomatic Python for Impatient Programmers (Paperback)
-
相關翻譯:
Python 風格徹底研究|超詳實、好理解的 Python 必學主題 (Dead Simple Python) (繁中版)
下單後立即進貨 (約4週~6週)
相關主題
商品描述
本書全面細致地介紹了Python的各個功能、邏輯和慣用模式,以便讀者快速編寫出專業、地道、實用的Python程序,從Python新手成長為高手。
本書共5個部分。第一部分“Python 環境”講解 Python的哲學、開發環境、基本語法、項目結構和代碼導入等內容,為讀者編寫規範的Python代碼奠定堅實的基礎。第二部分“基本結構”講解Python的變量、數據類型、函數、類、對象、錯誤和異常等。第三部分“數據和流程”講解操作數據和控制執行流程的許多獨特方法,包括集合、疊代、生成器、推導式、文本輸入/輸出、上下文管理、二進制和序列化等。第四部分“高級概念”探索Python 的高級策略,如繼承、混入、元類、抽象基類、自省、泛型、異步、並發、線程和並行等。第五部分“超越代碼”講解項目的打包、分發、調試、日誌、測試和剖析等環節,並概述Python開發的方向。
本書適合想要學習編寫專業Python程序的讀者閱讀,既可作為零基礎入門 Python 的教材,也可作為程序員案頭常備的Python工具書。本書尤其適合已掌握其他編程語言的開發者用來學習Python,可以幫助這些開發者不受其他編程語言的影響來學習地道的 Python編程方法。
作者簡介
作者簡介
賈森·C. 麥克唐納(Jason C. McDonald,網絡id為CodeMouse92)擁有十余年軟件工程經驗,曾作為開發者或管理者在多家公司工作,經歷過各種類型的項目,並多次在員工培訓、技術會議和大學中進行軟件開發、管理和職業發展等主題的演講和教學。他還是Ubuntu社區、開放源碼倡議和Python軟件基金會的成員,以及DEV社區的版主。
譯者簡介
周琦(Zoom.Quiet),蟒營創始人,嗶哩嗶哩“大媽的多重宇宙”頻道主理人,2004年作為聯合創始人創建CPyUG(中國Python用戶組),2011—2014年連續主持籌辦4屆PyCon China,曾就職於新浪、金山軟件等公司。
李者璈(Manjusaka),PyCon China負責人,Python播客“捕蛇者說”聯合創始人,微軟MVP,曾就職於阿裏雲、餓了麼等公司。
目錄大綱
第 一部分 Python環境
第 1章 Python的哲學 ... 2
1.1 到底什麼是Python ... 2
1.2 破除誤解:Python不是什麼 ... 2
1.2.1 誤解1:Python僅僅是一種腳本語言 ... 3
1.2.2 誤解2:Python很慢 ... 3
1.2.3 誤解3:Python不能被編譯 ... 3
1.2.4 誤解4:Python在後臺編譯 ... 4
1.2.5 誤解5:Python不適合大型項目 ... 4
1.3 Python 2 vs Python 3 ... 4
1.4 定義“Pythonic”代碼 ... 5
1.5 Python之禪 ... 5
1.6 文檔、PEP和你 ... 6
1.7 社區中誰說了算? ... 7
1.8 Python社區 ... 7
1.9 對“明顯的方式”的追求 ... 8
1.10 本章小結 ... 9
第 2章 Python開發環境 ... 10
2.1 安裝Python ... 10
2.1.1 在Windows系統中安裝Python ... 10
2.1.2 在macOS系統中安裝Python ... 11
2.1.3 在Linux系統中安裝Python ... 11
2.1.4 通過源代碼構建Python ... 11
2.2 認識Python解釋器 ... 13
2.2.1 交互式會話 ... 13
2.2.2 運行Python文件 ... 14
2.3 包和虛擬環境 ... 14
2.3.1 創建一個虛擬環境 ... 15
2.3.2 激活虛擬環境 ... 15
2.3.3 退出虛擬環境 ... 16
2.4 pip介紹 ... 16
2.4.1 系統範圍的包 ... 16
2.4.2 安裝包 ... 16
2.4.3 requirements.txt ... 17
2.4.4 更新包 ... 17
2.4.5 卸載包 ... 17
2.4.6 搜索包 ... 18
2.4.7 一個關於pip的警告 ... 18
2.5 虛擬環境和Git ... 18
2.5.1 shebang ... 19
2.5.2 文件編碼 ... 20
2.6 一些額外的關於虛擬環境的小貼士 ... 21
2.6.1 在不激活虛擬環境的情況下使用虛擬環境 ... 21
2.6.2 一些替代品 ... 21
2.7 認識PEP 8 ... 22
2.7.1 行寬限制的歷史債務 ... 22
2.7.2 制表符還是空格 ... 23
2.8 代碼質量控制:靜態分析工具 ... 23
2.8.1 Pylint ... 23
2.8.2 Flake8 ... 25
2.8.3 Mypy ... 26
2.9 代碼風格守護者:自動格式化工具 ... 26
2.9.1 autopep8 ... 27
2.9.2 Black ... 27
2.10 測試框架 ... 27
2.11 代碼編輯器一覽 ... 27
2.11.1 IDLE ... 28
2.11.2 Emacs和Vim ... 28
2.11.3 PyCharm ... 28
2.11.4 Visual Studio Code ... 28
2.11.5 Sublime Text ... 29
2.11.6 Spyder ... 29
2.11.7 Eclipse配合PyDev/LiClipse ... 29
2.11.8 Eric Python IDE ... 29
2.12 本章小結 ... 30
第3章 語法速成課程 ... 31
3.1 “Hello, world!”程序 ... 31
3.2 語句和表達式 ... 31
3.3 空格的重要性 ... 32
3.4 空語句 ... 33
3.5 註釋以及文檔字符串 ... 33
3.6 聲明變量 ... 34
3.7 數學操作 ... 35
3.7.1 初識數字類型 ... 35
3.7.2 運算符 ... 36
3.7.3 math模塊 ... 37
3.8 邏輯 ... 38
3.8.1 條件語句 ... 38
3.8.2 比較運算符 ... 39
3.8.3 Boolean、None和身份運算符 ... 39
3.8.4 真實性 ... 40
3.8.5 邏輯運算符 ... 41
3.8.6 海象運算符 ... 41
3.8.7 省略符 ... 42
3.9 字符串 ... 42
3.9.1 字符串字面量 ... 42
3.9.2 原始字符串 ... 44
3.9.3 格式化字符串 ... 44
3.9.4 模板字符串 ... 48
3.9.5 字符串轉換 ... 49
3.9.6 字符串拼接的註意事項 ... 49
3.10 函數 ... 50
3.11 類和對象 ... 50
3.12 異常處理 ... 51
3.13 元組和列表 ... 52
3.14 循環 ... 53
3.14.1 while循環 ... 53
3.14.2 循環控制 ... 53
3.14.3 for循環 ... 54
3.15 結構模式匹配 ... 54
3.15.1 文本模式和通配符 ... 54
3.15.2 or模式 ... 55
3.15.3 捕獲模式 ... 55
3.15.4 門衛語句 ... 56
3.15.5 更多關於模式匹配的信息 ... 57
3.16 本章小結 ... 57
第4章 項目結構和代碼導入 ... 58
4.1 設置代碼倉庫 ... 58
4.2 模塊和包 ... 58
4.2.1 PEP 8和命名 ... 59
4.2.2 項目的目錄結構 ... 59
4.3 import是如何工作的 ... 60
4.4 導入操作的註意事項 ... 61
4.4.1 從模塊中導入函數 ... 62
4.4.2 覆蓋問題 ... 62
4.4.3 包嵌套問題 ... 63
4.4.4 謹防導入所有 ... 64
4.5 在項目中使用import ... 65
4.5.1 絕對導入 ... 65
4.5.2 相對導入 ... 66
4.5.3 從同一個包中導入 ... 66
4.6 入口點 ... 67
4.6.1 模塊入口點 ... 67
4.6.2 包入口點 ... 68
4.6.3 控制包的導入 ... 69
4.6.4 程序入口點 ... 70
4.7 Python模塊搜索路徑 ... 71
4.8 導入模塊時底層發生了什麼? ... 71
4.9 本章小結 ... 73
第二部分 基本結構
第5章 變量和數據類型 ... 76
5.1 Python中的變量:名稱和值 ... 76
5.2 賦值 ... 76
5.3 數據類型 ... 78
5.3.1 type()函數 ... 79
5.3.2 鴨子類型 ... 79
5.4 作用域和垃圾回收 ... 80
5.4.1 局部作用域以及引用計數垃圾回收器 ... 80
5.4.2 解釋器關閉 ... 81
5.4.3 全局作用域 ... 81
5.4.4 全局作用域的註意事項 ... 83
5.4.5 nonlocal關鍵字 ... 83
5.4.6 作用域解析 ... 84
5.4.7 關於類的一些特殊情況 ... 84
5.4.8 分代垃圾回收器 ... 85
5.5 不可變的真相 ... 85
5.6 賦值傳遞 ... 86
5.7 集合和引用 ... 87
5.7.1 淺拷貝 ... 89
5.7.2 深拷貝 ... 91
5.8 隱式類型轉換和顯式類型轉換 ... 92
5.9 關於匈牙利命名法的註意事項 ... 93
5.10 術語回顧 ... 94
5.11 本章小結 ... 95
第6章 函數和匿名函數 ... 96
6.1 Python函數基礎 ... 98
6.2 遞歸 ... 99
6.3 默認參數值 ... 100
6.4 關鍵字參數 ... 102
6.5 重載函數 ... 104
6.6 可變參數 ... 104
6.7 僅關鍵字參數 ... 106
6.7.1 僅位置參數 ... 106
6.7.2 參數類型:都在這兒了! ... 107
6.8 嵌套函數 ... 107
6.9 閉包 ... 108
6.9.1 帶閉包的遞歸 ... 109
6.9.2 有狀態閉包 ... 110
6.10 lambda表達式 ... 111
6.10.1 為什麼lambda表達式很有用? ... 111
6.10.2 將lambda表達式作為排序鍵 ... 113
6.11 裝飾器 ... 114
6.12 類型提示及函數註解 ... 116
6.12.1 鴨子類型和類型提示 ... 118
6.12.2 應該使用類型提示嗎? ... 118
6.13 本章小結 ... 119
第7章 類和對象 ... 120
7.1 聲明一個類 ... 121
7.1.1 初始化器 ... 121
7.1.2 構造器 ... 122
7.1.3 終結器 ... 123
7.2 屬性 ... 124
7.2.1 實例屬性 ... 124
7.2.2 類屬性 ... 124
7.3 範圍命名約定 ... 125
7.3.1 非公共屬性 ... 125
7.3.2 公共屬性 ... 125
7.3.3 名稱修飾 ... 125
7.3.4 公共屬性、非公共屬性,還是名稱修飾? ... 126
7.4 方法 ... 127
7.4.1 實例方法 ... 127
7.4.2 類方法 ... 127
7.4.3 靜態方法 ... 128
7.5 特性 ... 128
7.5.1 設置場景 ... 129
7.5.2 定義一個特性 ... 130
7.5.3 使用裝飾器創建特性 ... 132
7.5.4 什麼時候不使用特性? ... 133
7.6 特殊方法 ... 134
7.6.1 場景設置 ... 134
7.6.2 轉換方法 ... 135
7.6.3 比較方法 ... 138
7.6.4 二元運算符支持 ... 139
7.6.5 一元運算符支持 ... 140
7.6.6 讓類可調用 ... 141
7.6.7 更多特殊方法 ... 141
7.7 類裝飾器 ... 142
7.8 對象的結構模式匹配 ... 143
7.9 函數式編程和面向對象編程 ... 145
7.10 什麼時候使用類? ... 146
7.10.1 類不是模塊 ... 146
7.10.2 單一職責 ... 146
7.10.3 共享狀態 ... 146
7.10.4 對象是否適合你? ... 146
7.11 本章小結 ... 147
第8章 錯誤和異常 ... 148
8.1 Python中的異常 ... 148
8.2 閱讀異常信息 ... 150
8.3 捕獲異常:LBYL和EAFP ... 151
8.4 多異常處理 ... 152
8.5 當心“尿布反模式” ... 153
8.6 拋出異常 ... 155
8.7 使用異常 ... 157
8.7.1 異常和日誌 ... 158
8.7.2 冒泡 ... 161
8.7.3 異常鏈 ... 162
8.8 else和finally ... 164
8.8.1 else:如果所有功能正常運行 ... 164
8.8.2 finally:在所有語句之後 ... 165
8.9 創建異常 ... 168
8.10 異常一覽 ... 169
8.11 本章小結 ... 170
第三部分 數據和流程
第9章 集合與疊代 ... 172
9.1 循環 ... 172
9.1.1 while循環 ... 172
9.1.2 for循環 ... 174
9.2 集合 ... 174
9.2.1 元組 ... 174
9.2.2 具名元組 ... 175
9.2.3 列表 ... 175
9.2.4 雙端隊列 ... 177
9.2.5 可變集合 ... 178
9.2.6 不可變集合 ... 179
9.2.7 字典 ... 179
9.2.8 檢查還是例外? ... 180
9.2.9 字典變體 ... 181
9.3 集合的解包 ... 182
9.3.1 星號表達式 ... 183
9.3.2 字典的解包 ... 184
9.4 集合的結構模式匹配 ... 185
9.5 以索引或鍵訪問元素 ... 186
9.6 切片符 ... 187
9.6.1 開始和停止 ... 188
9.6.2 負索引 ... 188
9.6.3 步長 ... 189
9.6.4 切片復制 ... 190
9.6.5 切片對象 ... 190
9.6.6 對自定義對象切片 ... 191
9.6.7 使用islice() ... 191
9.7 in運算符 ... 191
9.8 檢驗集合的長度 ... 192
9.9 疊代 ... 193
9.9.1 可疊代對象和疊代器 ... 193
9.9.2 手動使用疊代器 ... 194
9.9.3 用for循環進行疊代 ... 196
9.9.4 在循環中對集合進行排序 ... 197
9.9.5 枚舉循環 ... 198
9.9.6 循環中的突變 ... 198
9.9.7 嵌套循環和替代方案 ... 200
9.10 疊代工具 ... 202
9.10.1 基礎內建工具 ... 202
9.10.2 filter ... 202
9.10.3 map ... 203
9.10.4 zip ... 204
9.10.5 itertools ... 205
9.11 自定義可疊代類 ... 205
9.12 本章小結 ... 209
第 10章 生成器和推導式 ... 210
10.1 惰性求值和貪婪疊代 ... 210
10.2 無限疊代器 ... 211
10.3 生成器 ... 211
10.3.1 生成器vs疊代器類 ... 213
10.3.2 生成器關閉 ... 215
10.3.3 行為關閉 ... 216
10.3.4 異常拋出 ... 217
10.4 yield from ... 219
10.5 生成器表達式 ... 220
10.5.1 生成器對象都是惰性的 ... 222
10.5.2 生成器表達式具有復合循環 ... 222
10.5.3 生成器表達式中的條件 ... 223
10.5.4 嵌套生成器表達式 ... 226
10.6 列表推導式 ... 226
10.7 集合推導式 ... 227
10.8 字典推導式 ... 228
10.9 生成器表達式的隱患 ... 228
10.9.1 它們很快就會變得不可讀 ... 228
10.9.2 它們無法替代循環 ... 229
10.9.3 它們很難調試 ... 230
10.9.4 何時用生成器表達式 ... 230
10.10 簡單協程 ... 231
10.10.1 從協程返回值 ... 233
10.10.2 行為序列 ... 233
10.11 異步又如何? ... 234
10.12 本章小結 ... 234
第 11章 文本輸入/輸出和上下文管理 ... 235
11.1 標準輸入和輸出 ... 235
11.1.1 重溫print() ... 235
11.1.2 重溫input() ... 239
11.2 流 ... 240
11.3 上下文管理器基礎 ... 241
11.4 文件模式 ... 242
11.5 讀取文件 ... 243
11.5.1 read()方法 ... 243
11.5.2 readline()方法 ... 244
11.5.3 readlines()方法 ... 244
11.5.4 疊代讀取 ... 245
11.6 流位置 ... 245
11.7 寫入文件 ... 246
11.7.1 write()方法 ... 247
11.7.2 writelines()方法 ... 248
11.7.3 用print()寫文件 ... 249
11.7.4 行分隔符 ... 250
11.8 上下文管理器的細節 ... 250
11.8.1 上下文管理器如何工作? ... 250
11.8.2 使用多個上下文管理器 ... 251
11.8.3 實現上下文管理協議 ... 252
11.8.4 __enter__()方法 ... 253
11.8.5 __exit__()方法 ... 254
11.8.6 使用自定義類 ... 254
11.9 路徑 ... 256
11.9.1 路徑對象 ... 257
11.9.2 路徑組成 ... 258
11.9.3 創建路徑 ... 261
11.9.4 相對路徑 ... 262
11.9.5 相對包路徑 ... 263
11.9.6 路徑操作 ... 265
11.9.7 異地文件寫入 ... 266
11.9.8 os模塊 ... 267
11.10 文件格式 ... 268
11.10.1 JSON ... 268
11.10.2 其他格式 ... 271
11.11 本章小結 ... 273
第 12章 二進制和序列化 ... 274
12.1 二進制表示和位運算 ... 274
12.1.1 數字系統 ... 274
12.1.2 Python整數和二進制 ... 278
12.1.3 位運算 ... 279
12.2 字節字面量 ... 281
12.3 類字節對象 ... 282
12.3.1 創建字節對象 ... 282
12.3.2 使用int.to_bytes() ... 284
12.3.3 序列操作 ... 285
12.3.4 將字節對象轉換為整數 ... 285
12.4 struct模塊 ... 286
12.4.1 struct格式字符串和打包 ... 286
12.4.2 用struct解包 ... 289
12.4.3 struct對象 ... 290
12.5 類字節對象的位運算 ... 291
12.5.1 通過整數進行位運算 ... 291
12.5.2 通過疊代進行位運算 ... 292
12.6 memoryview ... 294
12.7 讀寫二進制文件 ... 295
12.7.1 數據組織 ... 296
12.7.2 文件寫入 ... 299
12.7.3 從二進制文件讀取 ... 300
12.7.4 從二進制流中查找 ... 302
12.7.5 BufferedRWPair ... 303
12.8 序列化技術 ... 303
12.8.1 禁忌工具:pickle、marshal和shelve ... 304
12.8.2 序列化格式 ... 305
12.9 本章小結 ... 307
第四部分 高級概念
第 13章 繼承和混入 ... 310
13.1 何時使用繼承? ... 312
13.2 Python的基礎繼承 ... 313
13.3 多繼承 ... 315
13.3.1 方法解析順序 ... 315
13.3.2 確保方法解析順序一致 ... 318
13.3.3 顯式地指定解析順序 ... 321
13.3.4 解析多繼承中的基類 ... 321
13.4 混入 ... 324
13.5 本章小結 ... 326
第 14章 元類和抽象基類 ... 327
14.1 元類 ... 327
14.1.1 用類型創建類 ... 327
14.1.2 自定義元類 ... 329
14.2 用鴨子類型進行類型推導 ... 330
14.2.1 EAFP:捕獲異常 ... 330
14.2.2 LBYL:檢查屬性 ... 331
14.3 抽象基類 ... 332
14.3.1 內置抽象基類 ... 333
14.3.2 從抽象基類派生 ... 333
14.3.3 實現自定義抽象基類 ... 336
14.4 虛擬子類 ... 338
14.4.1 設置示例 ... 339
14.4.2 使用虛擬子類 ... 341
14.5 本章小結 ... 343
第 15章 自省和泛型 ... 344
15.1 特殊屬性 ... 344
15.2 內部對象屬性訪問:__dict__特殊屬性 ... 344
15.2.1 列出屬性 ... 346
15.2.2 獲取屬性 ... 347
15.2.3 檢查屬性 ... 348
15.2.4 設置屬性 ... 349
15.2.5 刪除屬性 ... 350
15.3 函數屬性 ... 351
15.3.1 函數屬性的錯誤使用方式 ... 351
15.3.2 可變性和函數屬性 ... 353
15.4 描述符 ... 353
15.4.1 描述符協議 ... 354
15.4.2 編寫描述符類(有點問題的方式) ... 354
15.4.3 使用描述符 ... 355
15.4.4 以正確方式編寫描述符類 ... 356
15.4.5 在同一個類中使用多個描述符 ... 358
15.5 slots ... 360
15.5.1 將屬性名綁定到值 ... 361
15.5.2 通過slots使用任意屬性 ... 361
15.5.3 slots和繼承 ... 362
15.6 不可變類 ... 362
15.7 單分派泛型函數 ... 365
15.7.1 用類型提示註冊單分派泛型函數 ... 365
15.7.2 用顯式類型註冊單分派泛型函數 ... 366
15.7.3 用register()方法註冊單分派泛型函數 ... 367
15.8 使用元素類 ... 367
15.9 任意執行 ... 368
15.10 本章小結 ... 370
第 16章 異步和並發 ... 371
16.1 Python中的異步 ... 372
16.2 示例場景:Collatz遊戲同步版本 ... 374
16.3 異步 ... 376
16.3.1 原生協程 ... 376
16.3.2 任務 ... 378
16.3.3 事件循環 ... 379
16.3.4 令其(實際上)異步 ... 380
16.4 調度和異步執行流程 ... 381
16.5 異步疊代 ... 383
16.6 異步上下文管理器 ... 385
16.7 異步生成器 ... 385
16.8 其他異步概念 ... 386
16.9 本章小結 ... 386
第 17章 線程和並行 ... 387
17.1 線程 ... 387
17.1.1 並發vs並行 ... 387
17.1.2 基本線程 ... 388
17.1.3 超時 ... 390
17.1.4 守護線程 ... 391
17.1.5 futures和執行器 ... 391
17.1.6 futures的超時 ... 393
17.2 條件競爭 ... 395
17.2.1 條件競爭示例 ... 397
17.2.2 用ThreadPoolExecutor創建多線程 ... 398
17.3 鎖 ... 399
17.4 死鎖、活鎖和饑鎖 ... 400
17.5 用隊列傳遞消息 ... 401
17.6 多工作線程的future ... 402
17.7 多進程實現並行 ... 404
17.7.1 序列化數據 ... 404
17.7.2 加速註意事項和ProcessPoolExecutor ... 405
17.8 生產者/消費者問題 ... 407
17.8.1 導入模塊 ... 407
17.8.2 監視隊列 ... 408
17.8.3 子進程清理 ... 408
17.8.4 消費者 ... 409
17.8.5 檢查空隊列 ... 410
17.8.6 生產者 ... 410
17.8.7 啟動進程 ... 411
17.8.8 性能結果 ... 411
17.8.9 多進程日誌 ... 412
17.9 本章小結 ... 412
第五部分 超越代碼
第 18章 打包和分發 ... 416
18.1 規劃打包 ... 416
18.1.1 貨物崇拜式編程的危險 ... 417
18.1.2 關於打包的觀點 ... 417
18.1.3 確定打包目標 ... 417
18.2 項目結構:src或src-less ... 419
18.3 用setuptools打包和分發 ... 419
18.3.1 項目文件和結構 ... 420
18.3.2 元數據歸屬 ... 420
18.3.3 README.md和LICENSE文檔 ... 420
18.3.4 setup.cfg文件 ... 421
18.3.5 setup.py文件 ... 426
18.3.6 MANIFEST.in文件 ... 427
18.3.7 requirements.txt文件 ... 428
18.3.8 pyproject.toml文件 ... 429
18.3.9 測試配置的設置 ... 430
18.4 構建你的包 ... 430
18.5 發布到pip ... 431
18.5.1 上傳到TestPyPI ... 431
18.5.2 安裝你上傳的包 ... 432
18.5.3 上傳到PyPI ... 433
18.6 其他打包工具 ... 433
18.6.1 Poetry ... 433
18.6.2 Flit ... 433
18.7 分發給最終用戶 ... 433
18.7.1 PEX ... 434
18.7.2 凍結器 ... 434
18.7.3 鏡像和容器 ... 435
18.7.4 原生Linux包註意事項 ... 437
18.8 文檔 ... 438
18.9 本章小結 ... 439
第 19章 調試和日誌 ... 440
19.1 警告 ... 440
19.1.1 警告的類型 ... 441
19.1.2 過濾警告 ... 442
19.1.3 將警告轉換為異常 ... 443
19.2 日誌記錄 ... 444
19.2.1 Logger對象 ... 444
19.2.2 Handler對象 ... 445
19.2.3 日誌記錄級別 ... 447
19.2.4 控制日誌級別 ... 448
19.2.5 運行示例程序 ... 449
19.2.6 過濾器、格式化程序和配置文件 ... 450
19.3 斷言語句 ... 450
19.3.1 正確使用斷言 ... 450
19.3.2 錯誤使用斷言 ... 452
19.3.3 實戰中的斷言 ... 453
19.4 inspect模塊 ... 454
19.5 使用pdb ... 454
19.5.1 調試案例 ... 454
19.5.2 啟動調試器 ... 455
19.5.3 調試器shell指令 ... 456
19.5.4 單步穿行代碼 ... 456
19.5.5 設置斷點並單步執行函數 ... 457
19.5.6 遍歷執行棧 ... 458
19.5.7 探查源代碼 ... 459
19.5.8 檢驗解決方案 ... 460
19.5.9 事後調試 ... 461
19.6 使用faulthandler ... 462
19.7 用Bandit評估程序安全性 ... 463
19.8 向Python開發團隊匯報問題 ... 465
19.9 本章小結 ... 466
第 20章 測試和剖析 ... 467
20.1 什麼是TDD? ... 467
20.2 測試框架 ... 467
20.3 示例項目 ... 468
20.4 測試和項目結構 ... 469
20.5 基礎測試 ... 470
20.5.1 啟動示例 ... 470
20.5.2 單元測試 ... 471
20.5.3 用pytest執行測試 ... 472
20.5.4 測試異常 ... 473
20.6 測試夾具 ... 474
20.6.1 繼續之前的示例:使用API ... 476
20.6.2 在測試模塊間共享數據 ... 477
20.7 不穩定測試和有條件忽略測試 ... 478
20.8 高級夾具:模擬和參數化 ... 479
20.8.1 繼續之前的示例:表達拼寫錯誤 ... 479
20.8.2 參數化 ... 481
20.8.3 間接參數化夾具 ... 482
20.8.4 動態替換模擬輸入 ... 483
20.8.5 標記 ... 484
20.8.6 從標準流中捕獲 ... 486
20.8.7 GUI測試 ... 488
20.8.8 繼續之前的示例:將API連接到Typo ... 488
20.8.9 自動夾具 ... 489
20.8.10 混合參數化 ... 490
20.8.11 模糊測試 ... 491
20.8.12 完成示例 ... 491
20.9 代碼覆蓋率 ... 492
20.10 用tox進行自動化測試 ... 494
20.11 基準測試和性能分析 ... 496
20.11.1 用timeit進行基準測試 ... 496
20.11.2 用cProfile或profile進行性能分析 ... 497
20.11.3 tracemalloc ... 500
20.12 本章小結 ... 501
第 21章 前路迢迢 ... 502
21.1 關於未來 ... 502
21.2 你想出發去哪兒? ... 503
21.2.1 Python應用程序開發 ... 503
21.2.2 Python遊戲開發 ... 504
21.2.3 Python Web開發 ... 504
21.2.4 客戶端Python ... 505
21.2.5 Python數據科學 ... 505
21.2.6 Python機器學習 ... 506
21.2.7 安全 ... 507
21.2.8 Python嵌入式開發 ... 508
21.2.9 腳本 ... 508
21.3 Python特色 ... 508
21.4 開發Python本身 ... 509
21.4.1 開發Python包和工具 ... 509
21.4.2 開發Python擴展 ... 510
21.4.3 為Python做各種貢獻 ... 511
21.5 和Python共同成長 ... 512
21.5.1 提出問題 ... 512
21.5.2 回答問題 ... 513
21.5.3 用戶組 ... 513
21.5.4 PyLadies ... 514
21.5.5 參加各種會議 ... 514
21.5.6 加入Python軟件基金會 ... 514
21.6 在這條路上一直走下去 ... 515
附錄A 特殊方法和屬性 ... 516
附錄B pdb指令 ... 522
附錄C Guido van Rossum的國王節演講 ... 525
譯者後記 ... 529