Python函数式编程 第2版

作者
丛书名
图灵程序设计丛书
出版社
人民邮电出版社
ISBN
9787115520173
简要
简介
内容简介书籍计算机书籍 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


版权声明




有问题微信扫码联系

推荐

Understand China
桂ICP备20004708号-4