Python函数式编程 第2版
作者:(美)史蒂文 洛特著
出版时间:2019年版
内容简介
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
版权声明