內容簡介
Python具備函式式編程的許多核心特徵,因此可以借鑑其他函式式語言的設計模式和編程技術,編寫出簡潔優雅的代碼。本書首先介紹函式式編程的一般概念及特點,然後講解疊代器、生成器表達式、內置函式、常用高階函式、遞歸與歸約、實用模組和裝飾器的用法,以及避開Python嚴格求值順序的變通方法、Web服務設計方法和一些最佳化技巧。
圖書目錄
前言
第 1章 函式式編程概述 1
1.1 編程範式 1
1.2 細分過程範式 2
1.2.1 使用函式式範式 3
1.2.2 使用混合範式 5
1.2.3 對象的創建過程 6
1.2.4 烏龜諒奔幾樂塔 7
1.3 函式式編程經典示例 7
1.4 EDA 10
1.5 小結 10
第 2章 函式式編程的特點 11
2.1 頭等函式 11
2.1.1 純函式 12
2.1.2 高階函式 13
2.2 不可變數據結構 13
2.3 嚴格求值與非嚴格求值 14
2.4 用遞歸代替循環語句 16
2.5 函式類型系統 19
2.6 回到最初 19
2.7 幾個高級概念 20
2.8 小結 20
第3章 函式、疊代器和生成器 22
3.1 編寫純函式 23
3.2 函式作為頭等對象 24
3.3 使用字元串 25
3.4 使用元組和命名元組 26
3.4.1 使用生成器表達式 27
3.4.2 生成器的局限 30
3.4.3 組合生成器表達式 31
3.5 使用生成器函式清洗原始數據 31
3.6 使用列表、字典和set 33
3.6.1 使用狀態映射 36
3.6.2 使用bisect模組創蘭辨翻淋建映射 37
3.6.3 使用有狀態的set 38
3.7 小結 39
第4章 使用集合 40
4.1 函式分類概覽 40
4.2 使用可疊代對象 41
4.2.1 解析XML檔案 42
4.2.2 使用高級方法解析檔案 43
4.2.3 組對序列元素 45
4.2.4 顯式使用iter()函式 47
4.2.5 擴展簡單循環 48
4.2.6 將生成器表達式套用於標量函式 51
4.2.7 用any()函式和all()函式進行歸約 52
4.2.8 使用len()和sum() 54
4.2.9 使用匯總和計數進行統計分析 54
4.3 使用zip()函式實現結構化和平鋪序列 56
4.3.1 將壓縮序列解壓 58
4.3.2 平鋪序列 58
4.3.3 結構化一維序列 59
4.3.4 結構化一維序列的另一種方式 61
4.4 使用reversed()函式改變順序 62
4.5 使用enumerate()函式包含下標值 63
4.6 小結 63
第5章 高階函式 64
5.1 用max()函式和min()函式尋找極值 65
5.2 使用Python匿名函式 67
5.3 lambda與lambda運算元 69
5.4 使用map()將函式套用於集合 69
5.5 使用map()函式處理多個序列 70
5.6 使用filter()函式接收或捨棄數據 72
5.7 使用filter()函式檢測異常值 73
5.8 在iter()函式中使用哨兵值 74
5.9 使用sorted()函式將數據排序 75
5.10 編寫高階函式 75
5.11 編寫高階映射和過濾函式 76
5.11.1 拆包並映射數據 77
5.11.2 打包多項數據並映射 79
5.11.3 平鋪數據並映射 80
5.11.4 過濾並結構化數據 81
5.12 編寫生成器函式 83
5.13 使用可調用對象構建高階函式 84
5.14 設計模式回顧 87
5.15 小結 88
第6章 尋應遞歸與歸約 89
6.1 簡單數值遞歸 89
6.1.1 實現尾調用最佳化 90
6.1.2 保持遞歸形式 91
6.1.3 凝驗記處理複雜的尾調用最佳化 92
6.1.4 使用遞歸處理集挨晚翻合 93
6.1.5 集合的尾調用最佳化 94
6.1.6 集合殼迎記的歸約與摺疊:從多個到一個 95
6.2 group-by歸約:從多到少 96
6.2.1 用Counter做映射 97
6.2.2 用排序構建映射 98
6.2.3 使用鍵值分組或者分區數據 99
6.2.4 編寫更通用的group-by歸約 102
6.2.5 編寫高階歸約 103
6.2.6 編寫檔案解析器 104
6.3 小結 109
第7章 元組處理技術 110
7.1 使用元組收集數據 110
7.2 使用命名元組收集數據 112
7.3 使用估翻乎函式構造器創建命名元組 115
7.4 使用多種元組結構代替狀態類 115
7.4.1 賦等級值 118
7.4.2 用包裝代替狀態變化 120
7.4.3 以多次包裝代替狀態變化 121
7.4.4 計算斯皮爾曼等級順序相關度 122
7.5 多態與類型匹配 123
7.6 小結 128
第8章 itertools模組 129
8.1 使用無限疊代器 130
8.1.1 用count()計數 130
8.1.2 使用實數參數計數 131
8.1.3 用cycle()循環疊代 132
8.1.4 用repeat()重複單個值 134
8.2 使用有限疊代器 135
8.2.1 用enumerate()添加序號 135
8.2.2 用accumulate()計算匯總值 137
8.2.3 用chain()組合多個疊代器 138
8.2.4 用groupby()切分疊代器 139
8.2.5 用zip_longest()和zip()合併疊代器 140
8.2.6 用compress()過濾 140
8.2.7 用islice()選取子集 141
8.2.8 用dropwhile()和takewhile()過濾狀態 142
8.2.9 基於filterfalse()和filter()的兩種過濾方法 143
8.2.10 將starmap()和map()套用於數據 144
8.3 使用tee()函式克隆疊代器 145
8.4 itertools模組代碼範例 146
8.5 小結 147
第9章 高級itertools技術 148
9.1 笛卡兒積 148
9.2 對積進行歸約 149
9.2.1 計算距離 150
9.2.2 獲得所有像素和顏色 152
9.2.3 性能分析 153
9.2.4 重構問題 154
9.2.5 合併兩種變換 155
9.3 排列集合元素 156
9.4 生成所有組合 157
9.5 代碼範例 159
9.6 小結 160
第 10章 functools模組 161
10.1 函式工具 161
10.2 使用lru_cache保存已有計算結果 162
10.3 使用total_ordering定義類 163
10.4 使用partial()函式套用部分參數 166
10.5 使用reduce()函式歸約數據集 167
10.5.1 合併map()和reduce() 168
10.5.2 使用reduce()函式和partial()函式 170
10.5.3 使用map()函式和reduce()函式清洗數據 170
10.5.4 使用groupby()函式和reduce()函式 171
10.6 小結 173
第 11章 裝飾器設計技術 174
11.1 作為高階函式的裝飾器 174
11.2 橫切關注點 178
11.3 複合設計 178
11.4 向裝飾器添加參數 181
11.5 實現更複雜的裝飾器 183
11.6 複雜設計注意事項 184
11.7 小結 187
第 12章 multiprocessing和threading模組 188
12.1 函式式編程和並發 188
12.2 並發的意義 189
12.2.1 邊界條件 189
12.2.2 進程或執行緒間共享資源 190
12.2.3 從何處受益 191
12.3 使用多進程池和任務 191
12.3.1 處理大量大型檔案 192
12.3.2 解析日誌檔案之收集行數據 193
12.3.3 解析日誌行為命名元組 194
12.3.4 解析Access對象的其他欄位 196
12.3.5 過濾訪問細節 199
12.3.6 分析訪問細節 200
12.3.7 完整的分析過程 201
12.4 使用多進程池進行並發處理 202
12.4.1 使用apply()傳送單個請求 204
12.4.2 使用map_async()、starmap_async()和starmap_async()等函式 204
12.4.3 更複雜的多進程架構 205
12.4.4 使用concurrent.futures模組 205
12.4.5 使用concurrent.futures執行緒池 206
12.4.6 使用threading模組和queue模組 206
12.4.7 設計並發處理 207
12.5 小結 208
第 13章 條件表達式和operator模組 209
13.1 條件表達式求值 210
13.1.1 使用非嚴格字典規則 211
13.1.2 過濾True條件表達式 212
13.1.3 尋找匹配模式 213
13.2 使用operator模組代替匿名函式 214
13.3 運算符的星號映射 215
13.4 使用operator模組函式進行歸約 217
13.5 小結 218
第 14章 PyMonad庫 219
14.1 下載和安裝 219
14.2 函式式複合和柯里化 220
14.2.1 使用柯里化的高階函式 221
14.2.2 避易就難的柯里化 223
14.3 函式式複合和PyMonad*運算符 223
14.4 函子和套用型函子 224
14.5 單子的bind()函式和>>運算符 228
14.6 模擬實現單子 229
14.7 單子的其他特性 232
14.8 小結 233
第 15章 Web服務的函式式設計方法 234
15.1 HTTP“請求 回響”模型 234
15.1.1 通過cookie注入狀態 236
15.1.2 函式式設計的伺服器考量 236
15.1.3 深入研究函式式視圖 237
15.1.4 嵌套服務 237
15.2 WSGI標準 238
15.2.1 在WSGI處理期間拋出異常 240
15.2.2 實用的WSGI應用程式 242
15.3 將Web服務定義為函式 242
15.3.1 創建WSGI應用程式 243
15.3.2 獲取原始數據 245
15.3.3 運用過濾器 246
15.3.4 序列化結果 247
15.3.5 序列化數據為JSON或CSV格式 248
15.3.6 序列化數據為XML格式 249
15.3.7 序列化數據為HTML 250
15.4 跟蹤使用情況 251
15.5 小結 252
第 16章 最佳化與改進 254
16.1 記憶化和快取 254
16.2 指定記憶化 256
16.3 尾遞歸最佳化 257
16.4 最佳化存儲 258
16.5 最佳化精度 259
16.6 案例研究:卡方決策 259
16.6.1 使用Counter對象過濾和約分原始數據 260
16.6.2 讀取匯總信息 262
16.6.3 Counter對象的求和計算 263
16.6.4 Counter對象的機率計算 264
16.7 計算期望值並顯示列聯表 265
16.7.1 計算卡方值 267
16.7.2 計算卡方閾值 267
16.7.3 計算不完全伽馬函式 268
16.7.4 計算完全伽馬函式 270
16.7.5 計算隨機分布的機率 271
16.8 函式式編程設計模式 273
16.9 小結 274
著作權聲明
作者簡介
史蒂文·洛特(Steven F. Lott),軟體工程師、架構師、技術作家,20世紀70年代開始編程生涯,參與過100多個各種規模的項目研發。在使用Python解決業務問題方面,也有十餘年經驗。另著有《Python面向對象編程指南》等。
4.3.3 結構化一維序列 59
4.3.4 結構化一維序列的另一種方式 61
4.4 使用reversed()函式改變順序 62
4.5 使用enumerate()函式包含下標值 63
4.6 小結 63
第5章 高階函式 64
5.1 用max()函式和min()函式尋找極值 65
5.2 使用Python匿名函式 67
5.3 lambda與lambda運算元 69
5.4 使用map()將函式套用於集合 69
5.5 使用map()函式處理多個序列 70
5.6 使用filter()函式接收或捨棄數據 72
5.7 使用filter()函式檢測異常值 73
5.8 在iter()函式中使用哨兵值 74
5.9 使用sorted()函式將數據排序 75
5.10 編寫高階函式 75
5.11 編寫高階映射和過濾函式 76
5.11.1 拆包並映射數據 77
5.11.2 打包多項數據並映射 79
5.11.3 平鋪數據並映射 80
5.11.4 過濾並結構化數據 81
5.12 編寫生成器函式 83
5.13 使用可調用對象構建高階函式 84
5.14 設計模式回顧 87
5.15 小結 88
第6章 遞歸與歸約 89
6.1 簡單數值遞歸 89
6.1.1 實現尾調用最佳化 90
6.1.2 保持遞歸形式 91
6.1.3 處理複雜的尾調用最佳化 92
6.1.4 使用遞歸處理集合 93
6.1.5 集合的尾調用最佳化 94
6.1.6 集合的歸約與摺疊:從多個到一個 95
6.2 group-by歸約:從多到少 96
6.2.1 用Counter做映射 97
6.2.2 用排序構建映射 98
6.2.3 使用鍵值分組或者分區數據 99
6.2.4 編寫更通用的group-by歸約 102
6.2.5 編寫高階歸約 103
6.2.6 編寫檔案解析器 104
6.3 小結 109
第7章 元組處理技術 110
7.1 使用元組收集數據 110
7.2 使用命名元組收集數據 112
7.3 使用函式構造器創建命名元組 115
7.4 使用多種元組結構代替狀態類 115
7.4.1 賦等級值 118
7.4.2 用包裝代替狀態變化 120
7.4.3 以多次包裝代替狀態變化 121
7.4.4 計算斯皮爾曼等級順序相關度 122
7.5 多態與類型匹配 123
7.6 小結 128
第8章 itertools模組 129
8.1 使用無限疊代器 130
8.1.1 用count()計數 130
8.1.2 使用實數參數計數 131
8.1.3 用cycle()循環疊代 132
8.1.4 用repeat()重複單個值 134
8.2 使用有限疊代器 135
8.2.1 用enumerate()添加序號 135
8.2.2 用accumulate()計算匯總值 137
8.2.3 用chain()組合多個疊代器 138
8.2.4 用groupby()切分疊代器 139
8.2.5 用zip_longest()和zip()合併疊代器 140
8.2.6 用compress()過濾 140
8.2.7 用islice()選取子集 141
8.2.8 用dropwhile()和takewhile()過濾狀態 142
8.2.9 基於filterfalse()和filter()的兩種過濾方法 143
8.2.10 將starmap()和map()套用於數據 144
8.3 使用tee()函式克隆疊代器 145
8.4 itertools模組代碼範例 146
8.5 小結 147
第9章 高級itertools技術 148
9.1 笛卡兒積 148
9.2 對積進行歸約 149
9.2.1 計算距離 150
9.2.2 獲得所有像素和顏色 152
9.2.3 性能分析 153
9.2.4 重構問題 154
9.2.5 合併兩種變換 155
9.3 排列集合元素 156
9.4 生成所有組合 157
9.5 代碼範例 159
9.6 小結 160
第 10章 functools模組 161
10.1 函式工具 161
10.2 使用lru_cache保存已有計算結果 162
10.3 使用total_ordering定義類 163
10.4 使用partial()函式套用部分參數 166
10.5 使用reduce()函式歸約數據集 167
10.5.1 合併map()和reduce() 168
10.5.2 使用reduce()函式和partial()函式 170
10.5.3 使用map()函式和reduce()函式清洗數據 170
10.5.4 使用groupby()函式和reduce()函式 171
10.6 小結 173
第 11章 裝飾器設計技術 174
11.1 作為高階函式的裝飾器 174
11.2 橫切關注點 178
11.3 複合設計 178
11.4 向裝飾器添加參數 181
11.5 實現更複雜的裝飾器 183
11.6 複雜設計注意事項 184
11.7 小結 187
第 12章 multiprocessing和threading模組 188
12.1 函式式編程和並發 188
12.2 並發的意義 189
12.2.1 邊界條件 189
12.2.2 進程或執行緒間共享資源 190
12.2.3 從何處受益 191
12.3 使用多進程池和任務 191
12.3.1 處理大量大型檔案 192
12.3.2 解析日誌檔案之收集行數據 193
12.3.3 解析日誌行為命名元組 194
12.3.4 解析Access對象的其他欄位 196
12.3.5 過濾訪問細節 199
12.3.6 分析訪問細節 200
12.3.7 完整的分析過程 201
12.4 使用多進程池進行並發處理 202
12.4.1 使用apply()傳送單個請求 204
12.4.2 使用map_async()、starmap_async()和starmap_async()等函式 204
12.4.3 更複雜的多進程架構 205
12.4.4 使用concurrent.futures模組 205
12.4.5 使用concurrent.futures執行緒池 206
12.4.6 使用threading模組和queue模組 206
12.4.7 設計並發處理 207
12.5 小結 208
第 13章 條件表達式和operator模組 209
13.1 條件表達式求值 210
13.1.1 使用非嚴格字典規則 211
13.1.2 過濾True條件表達式 212
13.1.3 尋找匹配模式 213
13.2 使用operator模組代替匿名函式 214
13.3 運算符的星號映射 215
13.4 使用operator模組函式進行歸約 217
13.5 小結 218
第 14章 PyMonad庫 219
14.1 下載和安裝 219
14.2 函式式複合和柯里化 220
14.2.1 使用柯里化的高階函式 221
14.2.2 避易就難的柯里化 223
14.3 函式式複合和PyMonad*運算符 223
14.4 函子和套用型函子 224
14.5 單子的bind()函式和>>運算符 228
14.6 模擬實現單子 229
14.7 單子的其他特性 232
14.8 小結 233
第 15章 Web服務的函式式設計方法 234
15.1 HTTP“請求 回響”模型 234
15.1.1 通過cookie注入狀態 236
15.1.2 函式式設計的伺服器考量 236
15.1.3 深入研究函式式視圖 237
15.1.4 嵌套服務 237
15.2 WSGI標準 238
15.2.1 在WSGI處理期間拋出異常 240
15.2.2 實用的WSGI應用程式 242
15.3 將Web服務定義為函式 242
15.3.1 創建WSGI應用程式 243
15.3.2 獲取原始數據 245
15.3.3 運用過濾器 246
15.3.4 序列化結果 247
15.3.5 序列化數據為JSON或CSV格式 248
15.3.6 序列化數據為XML格式 249
15.3.7 序列化數據為HTML 250
15.4 跟蹤使用情況 251
15.5 小結 252
第 16章 最佳化與改進 254
16.1 記憶化和快取 254
16.2 指定記憶化 256
16.3 尾遞歸最佳化 257
16.4 最佳化存儲 258
16.5 最佳化精度 259
16.6 案例研究:卡方決策 259
16.6.1 使用Counter對象過濾和約分原始數據 260
16.6.2 讀取匯總信息 262
16.6.3 Counter對象的求和計算 263
16.6.4 Counter對象的機率計算 264
16.7 計算期望值並顯示列聯表 265
16.7.1 計算卡方值 267
16.7.2 計算卡方閾值 267
16.7.3 計算不完全伽馬函式 268
16.7.4 計算完全伽馬函式 270
16.7.5 計算隨機分布的機率 271
16.8 函式式編程設計模式 273
16.9 小結 274
著作權聲明
作者簡介
史蒂文·洛特(Steven F. Lott),軟體工程師、架構師、技術作家,20世紀70年代開始編程生涯,參與過100多個各種規模的項目研發。在使用Python解決業務問題方面,也有十餘年經驗。另著有《Python面向對象編程指南》等。