●前言
第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.4EDA10
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.組組26
3.4.1使用生成器表達式27
3.4.2生成器的局限30
3.4.3組合生成器表達式31
3.5使用生成器函數清洗原始數據31
3.6使用列表、字典和set33
3.6.1使用狀態映射36
3.6.2使用bisect模塊創建映射37
3.6.3使用有狀態的set38
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.3lambda與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.2group-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
組處理技術110
7.組收集數據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.4itertools模塊代碼範例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.1HTTP“請求響應”模型234
15.1.1通過cookie注入狀態236
15.1.2函數式設計的服務器考量236
15.1.3深入研究函數式視圖237
15.1.4嵌套服務237
15.2WSGI標準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序列化數據為HTML250
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.3Counter對像的求和計算263
16.6.4Counter對像的概率計算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