第1章 數(shù)據(jù)結(jié)構(gòu)和算法 1
1.1 將序列分解為單獨(dú)的變量 1
1.2 從任意長(zhǎng)度的可迭代對(duì)象中分解元素 3
1.3 保存最后N個(gè)元素 5
1.4 找到最大或最小的N個(gè)元素 7
1.5 實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列 9
1.6 在字典中將鍵映射到多個(gè)值上 11
1.7 讓字典保持有序 13
1.8 與字典有關(guān)的計(jì)算問題 14
1.9 在兩個(gè)字典中尋找相同點(diǎn) 15
1.10 從序列中移除重復(fù)項(xiàng)且保持元素間順序不變 17
1.11 對(duì)切片命名 18
1.12 找出序列中出現(xiàn)次數(shù)最多的元素 20
1.13 通過(guò)公共鍵對(duì)字典列表排序 22
1.14 對(duì)不原生支持比較操作的對(duì)象排序 23
1.15 根據(jù)字段將記錄分組 25
1.16 篩選序列中的元素 26
1.17 從字典中提取子集 29
1.18 將名稱映射到序列的元素中 30
1.19 同時(shí)對(duì)數(shù)據(jù)做轉(zhuǎn)換和換算 33
1.20 將多個(gè)映射合并為單個(gè)映射 34
第2章 字符串和文本 37
2.1 針對(duì)任意多的分隔符拆分字符串 37
2.2 在字符串的開頭或結(jié)尾處做文本匹配 38
2.3 利用Shell通配符做字符串匹配 40
2.4 文本模式的匹配和查找 42
2.5 查找和替換文本 45
2.6 以不區(qū)分大小寫的方式對(duì)文本做查找和替換 47
2.7 定義實(shí)現(xiàn)最短匹配的正則表達(dá)式 48
2.8 編寫多行模式的正則表達(dá)式 49
2.9 將Unicode文本統(tǒng)一表示為規(guī)范形式 50
2.10 用正則表達(dá)式處理Unicode字符 52
2.11 從字符串中去掉不需要的字符 53
2.12 文本過(guò)濾和清理? 54
2.13 對(duì)齊文本字符串? 57
2.14 字符串連接及合并? 59
2.15 給字符串中的變量名做插值處理 62
2.16 以固定的列數(shù)重新格式化文本 64
2.17 在文本中處理HTML和XML實(shí)體 66
2.18 文本分詞? 67
2.19 編寫一個(gè)簡(jiǎn)單的遞歸下降解析器 70
2.20 在字節(jié)串上執(zhí)行文本操作 80
第3章數(shù)字墨吓、日期和時(shí)間 83
3.1 對(duì)數(shù)值進(jìn)行取整 83
3.2 執(zhí)行精確的小數(shù)計(jì)算 85
3.3 對(duì)數(shù)值做格式化輸出 87
3.4 同二進(jìn)制莺奸、八進(jìn)制和十六進(jìn)制數(shù)打交道 89
3.5 從字節(jié)串中打包和解包大整數(shù) 90
3.6 復(fù)數(shù)運(yùn)算 92
3.7 處理無(wú)窮大和NaN 94
3.8 分?jǐn)?shù)的計(jì)算 96
3.9 處理大型數(shù)組的計(jì)算 97
3.10 矩陣和線性代數(shù)的計(jì)算 101
3.11 隨機(jī)選擇 103
3.12 時(shí)間換算 105
3.13 計(jì)算上周5的日期 107
3.14 找出當(dāng)月的日期范圍 108
3.15 將字符串轉(zhuǎn)換為日期 110
3.16 處理涉及到時(shí)區(qū)的日期問題 112
第4章 迭代器和生成器 114
4.1 手動(dòng)訪問迭代器中的元素 114
4.2 委托迭代 115
4.3 用生成器創(chuàng)建新的迭代模式 116
4.4 實(shí)現(xiàn)迭代協(xié)議 118
4.5 反向迭代 121
4.6 定義帶有額外狀態(tài)的生成器函數(shù) 122
4.7 對(duì)迭代器做切片操作 123
4.8 跳過(guò)可迭代對(duì)象中的前一部分元素 124
4.9 迭代所有可能的組合或排列 127
4.10 以索引-值對(duì)的形式迭代序列 129
4.11 同時(shí)迭代多個(gè)序列 131
4.12 在不同的容器中進(jìn)行迭代 133
4.13 創(chuàng)建處理數(shù)據(jù)的管道 134
4.14 扁平化處理嵌套型的序列 137
4.15 合并多個(gè)有序序列,再對(duì)整個(gè)有序序列進(jìn)行迭代 139
4.16 用迭代器取代while循環(huán) 140
第5章 文件和I/O 142
5.1 讀寫文本數(shù)據(jù) 142
5.2 將輸出重定向到文件中 145
5.3 以不同的分隔符或行結(jié)尾符完成打印 145
5.4 讀寫二進(jìn)制數(shù)據(jù) 146
5.5 對(duì)已不存在的文件執(zhí)行寫入操作 149
5.6 在字符串上執(zhí)行I/O操作 150
5.7 讀寫壓縮的數(shù)據(jù)文件 151
5.8 對(duì)固定大小的記錄進(jìn)行迭代 152
5.9 將二進(jìn)制數(shù)據(jù)讀取到可變緩沖區(qū)中 153
5.10 對(duì)二進(jìn)制文件做內(nèi)存映射 155
5.11 處理路徑名 157
5.12 檢測(cè)文件是否存在 158
5.13 獲取目錄內(nèi)容的列表 159
5.14 繞過(guò)文件名編碼 161
5.15 打印無(wú)法解碼的文件名 162
5.16 為已經(jīng)打開的文件添加或修改編碼方式 164
5.17 將字節(jié)數(shù)據(jù)寫入文本文件 166
5.18 將已有的文件描述符包裝為文件對(duì)象 167
5.19 創(chuàng)建臨時(shí)文件和目錄 169
5.20 同串口進(jìn)行通信 171
5.21 序列化Python對(duì)象 172
第6章 數(shù)據(jù)編碼與處理 177
6.1 讀寫CSV數(shù)據(jù) 177
6.2 讀寫JSON數(shù)據(jù) 181
6.3 解析簡(jiǎn)單的XML文檔 186
6.4 以增量方式解析大型XML文件 188
6.5 將字典轉(zhuǎn)換為XML 192
6.6 解析灵迫、修改和重寫XML 194
6.7 用命名空間來(lái)解析XML文檔 196
6.8 同關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互 198
6.9 編碼和解碼十六進(jìn)制數(shù)字 201
6.10 Base64編碼和解碼 202
6.11 讀寫二進(jìn)制結(jié)構(gòu)的數(shù)組 203
6.12讀取嵌套型和大小可變的二進(jìn)制結(jié)構(gòu) 207
6.13數(shù)據(jù)匯總和統(tǒng)計(jì) 218
第7章 函數(shù) 221
7.1 編寫可接受任意數(shù)量參數(shù)的函數(shù) 221
7.2 編寫只接受關(guān)鍵字參數(shù)的函數(shù) 223
7.3 將元數(shù)據(jù)信息附加到函數(shù)參數(shù)上 224
7.4 從函數(shù)中返回多個(gè)值 225
7.5 定義帶有默認(rèn)參數(shù)的函數(shù) 226
7.6 定義匿名或內(nèi)聯(lián)函數(shù) 229
7.7 在匿名函數(shù)中綁定變量的值 230
7.8 讓帶有N個(gè)參數(shù)的可調(diào)用對(duì)象以較少的參數(shù)形式調(diào)用 232
7.9 用函數(shù)替代只有單個(gè)方法的類 235
7.10 在回調(diào)函數(shù)中攜帶額外的狀態(tài) 236
7.11 內(nèi)聯(lián)回調(diào)函數(shù) 240
7.12 訪問定義在閉包內(nèi)的變量 242
第8章 類與對(duì)象 246
8.1 修改實(shí)例的字符串表示 246
8.2 自定義字符串的輸出格式 248
8.3 讓對(duì)象支持上下文管理協(xié)議 249
8.4 當(dāng)創(chuàng)建大量實(shí)例時(shí)如何節(jié)省內(nèi)存 251
8.5 將名稱封裝到類中 252
8.6 創(chuàng)建可管理的屬性 254
8.7 調(diào)用父類中的方法 259
8.8 在子類中擴(kuò)展屬性 263
8.9 創(chuàng)建一種新形式的類屬性或?qū)嵗龑傩?267
8.10 讓屬性具有惰性求值的能力 271
8.11 簡(jiǎn)化數(shù)據(jù)結(jié)構(gòu)的初始化過(guò)程 274
8.12 定義一個(gè)接口或抽象基類 278
8.13 實(shí)現(xiàn)一種數(shù)據(jù)模型或類型系統(tǒng) 281
8.14 實(shí)現(xiàn)自定義的容器 287
8.15 委托屬性的訪問 291
8.16 在類中定義多個(gè)構(gòu)造函數(shù) 296
8.17 不通過(guò)調(diào)用init來(lái)創(chuàng)建實(shí)例 298
8.18 用Mixin技術(shù)來(lái)擴(kuò)展類定義 299
8.19 實(shí)現(xiàn)帶有狀態(tài)的對(duì)象或狀態(tài)機(jī) 305
8.20 調(diào)用對(duì)象上的方法鹃锈,方法名以字符串形式給出 311
8.21 實(shí)現(xiàn)訪問者模式 312
8.22 實(shí)現(xiàn)非遞歸的訪問者模式 317
8.23 在環(huán)狀數(shù)據(jù)結(jié)構(gòu)中管理內(nèi)存? 324
8.24 讓類支持比較操作 327
8.25 創(chuàng)建緩存實(shí)例 330
第9章 元編程 335
9.1 給函數(shù)添加一個(gè)包裝 335
9.2 編寫裝飾器時(shí)如何保存函數(shù)的元數(shù)據(jù) 337
9.3 對(duì)裝飾器進(jìn)行解包裝 339
9.4 定義一個(gè)可接受參數(shù)的裝飾器 341
9.5 定義一個(gè)屬性可由用戶修改的裝飾器 342
9.6 定義一個(gè)能接收可選參數(shù)的裝飾器 346
9.7 利用裝飾器對(duì)函數(shù)參數(shù)強(qiáng)制執(zhí)行類型檢查 348
9.8 在類中定義裝飾器 352
9.9 把裝飾器定義成類 354
9.10 把裝飾器作用到類和靜態(tài)方法上 357
9.11 編寫裝飾器為被包裝的函數(shù)添加參數(shù) 359
9.12 利用裝飾器給類定義打補(bǔ)丁 362
9.13 利用元類來(lái)控制實(shí)例的創(chuàng)建 364
9.14 獲取類屬性的定義順序 367
9.15 定義一個(gè)能接受可選參數(shù)的元類 370
9.16 在*args和**kwargs上強(qiáng)制規(guī)定一種參數(shù)簽名 372
9.17 在類中強(qiáng)制規(guī)定編碼約定 375
9.18 通過(guò)編程的方式來(lái)定義類 378
9.19 在定義的時(shí)候初始化類成員 382
9.20 通過(guò)函數(shù)注解來(lái)實(shí)現(xiàn)方法重載 384
9.21 避免出現(xiàn)重復(fù)的屬性方法 391
9.22 以簡(jiǎn)單的方式定義上下文管理器 393
9.23 執(zhí)行帶有局部副作用的代碼 395
9.24 解析并分析Python源代碼 398
9.25 將Python源碼分解為字節(jié)碼 402
第10章 模塊和包 406
10.1 把模塊按層次結(jié)構(gòu)組織成包 406
10.2 對(duì)所有符號(hào)的導(dǎo)入進(jìn)行精確控制 407
10.3 用相對(duì)名稱來(lái)導(dǎo)入包中的子模塊 408
10.4 將模塊分解成多個(gè)文件 410
10.5 讓各個(gè)目錄下的代碼在統(tǒng)一的命名空間下導(dǎo)入 413
10.6 重新加載模塊 415
10.7 讓目錄或zip文件成為可運(yùn)打的腳本 416
10.8 讀取包中的數(shù)據(jù)文件 417
10.9 添加目錄到sys.path中 418
10.10 使用字符串中給定的名稱來(lái)導(dǎo)入模塊 420
10.11 利用import鉤子從遠(yuǎn)端機(jī)器上加載模塊 421
10.12 在模塊加載時(shí)為其打補(bǔ)丁 439
10.13 安裝只為自己所用的包 441
10.14 創(chuàng)建新的Python環(huán)境 442
10.15 發(fā)布自定義的包 444
第11章 網(wǎng)絡(luò)和Web編程 446
11.1 以客戶端的形式同HTTP服務(wù)交互 446
11.2 創(chuàng)建一個(gè)TCP服務(wù)器 450
11.3 創(chuàng)建一個(gè)UDP服務(wù)器 454
11.4 從CIDR地址中生成IP地址的范圍 456
11.5 創(chuàng)建基于REST風(fēng)格的簡(jiǎn)單接口 458
11.6 利用XML-RPC實(shí)現(xiàn)簡(jiǎn)單的遠(yuǎn)端過(guò)程調(diào)用 463
11.7 在不同的解釋器間進(jìn)行通信 466
11.8 實(shí)現(xiàn)遠(yuǎn)端過(guò)程調(diào)用 468
11.9 以簡(jiǎn)單的方式驗(yàn)證客戶端身份 472
11.10 為網(wǎng)絡(luò)服務(wù)增加SSL支持 474
11.11 在進(jìn)程間傳遞socket文件描述符 481
11.12 理解事件驅(qū)動(dòng)型I/O 486
11.13 發(fā)送和接收大型數(shù)組 493
第12章 并發(fā) 496
12.1 啟動(dòng)和停止線程 496
12.2 判斷線程是否已經(jīng)啟動(dòng) 499
12.3 線程間通信 503
12.4 對(duì)臨界區(qū)加鎖 508
12.5 避免死鎖 511
12.6 保存線程專有狀態(tài) 515
12.7 創(chuàng)建線程池 517
12.8 實(shí)現(xiàn)簡(jiǎn)單的并行編程 521
12.9 如何規(guī)避GIL帶來(lái)的限制 525
12.10? 定義一個(gè)Actor任務(wù) 528
12.11 實(shí)現(xiàn)發(fā)布者/訂閱者消息模式 532
12.12 使用生成器作為線程的替代方案 536
12.13 輪詢多個(gè)線程隊(duì)列 544
12.14 在UNIX上加載守護(hù)進(jìn)程 547
第13章 實(shí)用腳本和系統(tǒng)管理 552
13.1 通過(guò)重定向、管道或輸入文件來(lái)作為腳本的輸入 552
13.2 終止程序并顯示錯(cuò)誤信息 553
13.3 解析命令行選項(xiàng) 554
13.4 在運(yùn)行時(shí)提供密碼輸入提示 557
13.5 獲取終端大小 558
13.6 執(zhí)行外部命令并獲取輸出 558
13.7 拷貝或移動(dòng)文件和目錄 560
13.8 創(chuàng)建和解包歸檔文件 562
13.9 通過(guò)名稱來(lái)查找文件 563
13.10 讀取配置文件 565
13.11 給腳本添加日志記錄 568
13.12 給庫(kù)添加日志記錄 571
13.13 創(chuàng)建一個(gè)秒表計(jì)時(shí)器 573
13.14 給內(nèi)存和CPU使用量設(shè)定限制 575
13.15 加載Web瀏覽器 576
第14章 測(cè)試镰禾、調(diào)試以及異常 578
14.1 測(cè)試發(fā)送到stdout上的輸出 578
14.2 在單元測(cè)試中為對(duì)象打補(bǔ)丁 579
14.3 在單元測(cè)試中檢測(cè)異常情況 583
14.4 將測(cè)試結(jié)果作為日志記錄到文件中 585
14.5 跳過(guò)測(cè)試丹禀,或者預(yù)計(jì)測(cè)試結(jié)果為失敗 586
14.6 處理多個(gè)異常 587
14.7 捕獲所有的異常 589
14.8 創(chuàng)建自定義的異常 591
14.9 通過(guò)引發(fā)異常來(lái)響應(yīng)另一個(gè)異常 593
14.10 重新拋出上一個(gè)異常 595
14.11 發(fā)出告警信息 596
14.12 對(duì)基本的程序崩潰問題進(jìn)行調(diào)試 598
14.13 對(duì)程序做性能分析以及計(jì)時(shí)統(tǒng)計(jì) 600
14.14 讓你的程序運(yùn)行得更快 603
第15章 C語(yǔ)言擴(kuò)展 610
15.1 利用ctypes來(lái)訪問C代碼 612
15.2 編寫簡(jiǎn)單的C語(yǔ)言擴(kuò)展模塊 618
15.3 編寫一個(gè)可操作數(shù)組的擴(kuò)展函數(shù) 622
15.4 在C擴(kuò)展模塊中管理不透明指針 625
15.5 在擴(kuò)展模塊中定義并導(dǎo)出C API 628
15.6 從C中調(diào)用 Python 633
15.7 在C擴(kuò)展模塊中釋放GIL 639
15.8 混合使用C和Python環(huán)境中的線程 639
15.9 用Swig來(lái)包裝C代碼 640
15.10 用Cython來(lái)包裝C代碼 646
15.11 用Cython來(lái)高效操作數(shù)組 652
15.12 把函數(shù)指針轉(zhuǎn)換為可調(diào)用對(duì)象 657
15.13 把以NULL結(jié)尾的字符串傳給C庫(kù) 659
15.14 把Unicode字符串傳遞給C庫(kù) 663
15.15 把C字符串轉(zhuǎn)換到Python中 667
15.16 同編碼方式不確定的C字符串打交道 669
15.17 把文件名傳給C擴(kuò)展模塊 672
15.18 把打開的文件傳給C擴(kuò)展模塊 673
15.19 在C中讀取文件型對(duì)象 674
15.20 從C中訪問可迭代對(duì)象 677
15.21 排查段錯(cuò)誤 678