Python編程從新手到高手

[美] 賈森·C.麥克唐納(Jason C. McDonald)

  • Python編程從新手到高手-preview-1
  • Python編程從新手到高手-preview-2
Python編程從新手到高手-preview-1

相關主題

商品描述

本書全面細致地介紹了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