Python 函数式编程

函数式编程为创建代码简洁明了的软件提供了许多技术。虽然Python不是纯粹的函数式语言,但仍然可以使用Python进行函数式编程。

python具备函数式编程的许多核心特征,使得我们可以借鉴其他函数式语言的设计模式和编程技术,编写出简洁优雅的代码。尤其值得一提的是Python的生成器表达式,使用它可以避免在内存中创建大型数据结构,通过降低资源消耗来提高执行速度。

Python缺少创建纯粹函数式程序所需的一些语言特征,例如无限递归、针对所有表达式的惰性求值(lazy evaluation)以及优化编译器等。

函数式编程的许多核心要素都在Python中有所体现,例如函数是头等对象。Python还提供了许多典型的高阶函数,例如广泛使用的内置map()filter()functools.reduce()等,以及不那么明显的sorted()min()max()等。

本教程通过Python语言诠释函数式编程的核心思想,旨在利用函数式编程的优点,编写出代码简洁明了的Python程序。

文章目录

函数式编程概述
函数式编程通过在函数中定义表达式和对表达式求值完成计算。它尽量避免由于状态变化和使用可变对象引入复杂性,让程序变得简洁明了。本章将介绍函数式编程的一些基本技术,以及如何在Python中运用这些技术。最后会介绍通过这些设计模式构建Python应用时,函数式编程带来的好处。

Python 面向对象编程
Python 函数式编程示例

函数式编程的特点
Python内置了函数式编程的大部分特性。编写函数式的Python代码要求我们尽量避免使用命令式(包括过程式和面向对象式)编程技术。

本章的示例代码将涉及Python 3的类型提示语法。类型提示有助于开发者阐述函数定义的核心目标,这里使用mypy工具分析类型提示。与提供单元测试和代码静态分析的pylint类似,mypy也是构建高质量软件工具链的重要组成部分。
Python 纯函数
Python 不可变对象
Python 惰性求值
Python 递归代替循环
Python 函数类型系统

函数、迭代器和生成器
函数式编程的核心是使用纯函数将定义域中的值映射到值域。纯函数没有副作用,在Python中易于实现。

避免副作用意味着减少对通过变量赋值维护计算状态的依赖。我们不可能将赋值语句从Python中剔除,但可以减少对有状态对象的依赖,即需要从Python的内置数据结构中选择那些不依赖状态操作的数据类型。
Python 编写纯函数
Python 函数头等对象
Python 使用字符串
Python 使用元组和命名元组
Python 清洗原始数据
Python 使用列表、字典和set

使用集合
Python提供了很多能处理集合的函数,可以用于序列(列表或元组)、set、映射,以及生成器表达式返回的可迭代对象。本章将从函数式编程的视角研究Python的集合处理函数。

Python 函数分类
Python 可迭代对象
Python 解析XML文件
Python 高级方法解析文件
Python 组对序列元素
Python 使用iter()函数
Python 扩展简单循环
Python 生成器表达式
Python any()和all()进行规约
Python len()和 sum()
Python 汇总和计数进行统计分析
Python zip()实现结构化
Python 将压缩序列解压
Python 平铺序列
Python 结构化一维序列
Python 结构化一维序列二
Python reversed()改变顺序

高阶函数

函数式编程范式的一个重要特征是高阶函数。高阶函数指以函数为参数,或者以函数为返回值的函数。本章介绍Python提供的高阶函数,并进行一定的逻辑拓展。

Python max()和min()寻找极值
Python 匿名函数
Python map()应用于集合
Python map()处理多个序列
Python filter()接收或舍弃数据
Python filter()检测异常值
Python iter()使用哨兵值
Python sorted()数据排序
Python 编写高阶函数
Python 高阶映射和过滤函数
Python 拆包和映射数据
Python 打包多项数据并映射
Python 平铺数据并映射
Python 过滤并结构化数据
Python 编写生成器函数
Python 构建高阶函数

递归与归约

函数式语言的编译器会通过将尾递归调用转换为循环来优化递归函数,进而大幅提升函数性能。对于Python语言,纯粹的递归是受限的,必须手动优化尾调用,也就是显式地把递归调用转换为for循环。

本章会介绍归约算法sum()、count()、max()和min(),还会介绍collections.Counter()函数以及相关的groupby()函数。解析(以及文本扫描)其实是一种归约,因为它们将标记序列(或者字符序列)转换成了包含复杂属性的高阶集合。

Python 简单数值递归
Python 实现尾调用优化
Python 保持递归形式
Python 复杂的尾调用优化
Python 使用递归处理集合
Python 集合的尾调用优化
Python 集合的归约与折叠
Python group-by归约
Python 用Counter做映射
Python 用排序构建映射
Python 键值分组或分区数据
Python 通用的group-by归约
Python 编写高阶归约
Python 编写文件解析器

元组处理技术

面向对象编程的一个优点是可以渐进地创建复杂的数据结构。有时对象用作保存函数计算结果的缓存,这种情况很符合函数式设计模式的思想。有时对象的属性方法中定义了基于对象属性获得数据的复杂计算过程,同样可以方便地转换为函数式设计。

本章将介绍(1)如何创建并使用命名元组。(2)用不可变的命名元组代替有状态的对象类的方法。(3)不依赖多态类而编写抽象函数的技术。当然,可以基于Callable类创建多态类继承结构,但在某些情况下,使用函数式设计可以避免这些不必要的开销。

Python 使用元组收集数据
Python 命名元组收集数据
Python 创建命名元组
Python 元组结构代替状态类
Python 赋等级值
Python 包装代替状态变化
Python 多次包装代替状态变化
Python 斯皮尔曼等级顺序相关度
Python 多态与类型匹配

itertools模块

函数式编程强调使用无状态对象,在Python中,可以使用生成器表达式、生成器函数和可迭代对象代替庞大的可变对象来达到这个目标。本章介绍如何使用itertools库中的函数来处理可迭代集合,这个库的许多函数有助于我们使用可迭代序列对象和集合对象。

Python 用count()计数
Python 使用实数参数计数
Python 用cycle()循环迭代
Python 用repeat()重复单个值
Python 使用有限迭代器
Python enumerate()添加序号
Python accumulate()计算汇总值
Python chain()组合多个迭代器
Python groupby()切分迭代器
Python 用compress()过滤
Python 用islice()选取子集
Python dropwhile()和takewhile()过滤状态
Python filterfalse()和filter()过滤方法
Python starmap()和map()应用数据
Python tee()克隆迭代器
Python itertools模块代码范例

高级itertools技术

函数式编程强调程序的无状态性,在Python中,这意味着开发者应使用生成器表达式。本章继续介绍itertools库中用于处理可迭代集合的函数。

Python 笛卡儿积
Python 对积进行归约
Python 计算距离
Python 获得像素和颜色
Python 性能分析
Python 重构问题
Python 合并两种变换
Python 排列集合元素
Python 生成所有组合
Python 代码范例

functools模块

函数式编程强调将函数作为头等对象。前面介绍过用函数作为参数和返回值的高阶函数,本章将介绍functools库中用于创建和修改函数的几个高阶函数。

Python lru_cache保存计算结果
Python total_ordering定义类
Python 定义数字类
Python 使用partial()函数
Python reduce()归约数据集
Python 合并map()和reduce()
Python 使用reduce()和partial()
Python map()和reduce()清洗数据
Python groupby()和reduce()

装饰器设计技术

使用装饰器函数便于创建复合函数。复合函数是能表征多个源函数功能的单个函数。对于一个复杂算法,复合函数 f o g(x) 比 f(g(x)) 更清晰明了。对于开发者来说,有多种语法备选方案可表示复杂运算,通常会很有帮助。

本章讨论以下几个主题:(1)使用装饰器构建基于其他函数的函数;(2)functools模块中的wraps()函数,可用于构建装饰器;(3)update_wrapper()函数亦有所用。

Python 高阶函数的装饰器
Python 横切关注点
Python 复合设计
Python 向装饰器添加参数
Python 复杂的装饰器
Python 复杂设计注意事项

multiprocessing和threading模块

当消除了复杂的共享状态并围绕非严格执行处理展开设计时,便可以利用并行性来提高性能了。本章将介绍多进程技术和多线程技术。对于允许惰性求值的算法,Python的库包会特别有用。

Python 函数式编程和并发
Python 并发的意义
Python 使用多进程池和任务
Python 处理大量大型文件
Python 解析日志文件之收集行数据
Python 解析日志之命名元组
Python 解析Access对象
Python 过滤访问细节
Python 分析访问细节
Python 完整的分析过程
Python 多进程池进行并发处理

条件表达式和operator模块

Python中的if、elif和else语句对条件求值施以严格的执行顺序。本章会介绍如何摆脱这种严格的求值顺序,并在有限范围内写出非严格的条件语句。尚不清楚这样做能否有帮助,但它展示了如何以更函数式的方法表示算法。

Python 条件表达式求值
Python 使用非严格字典规则
Python 过滤True条件表达式
Python 寻找匹配模式
Python 使用operator模块代替匿名函数
Python 高阶函数获取命名属性
Python 运算符的星号映射
Python 使用operator模块函数进行归约

PyMonad库
利用单子,我们能以一种宽松的语言形式来指定表达式的求值顺序,例如可以使用单子来要求表达式 a+b+c 严格按照从左到右的顺序进行求值。这可能会干扰编译器优化表达式求值的能力,然而有时有必要这样做,例如希望以特定的顺序读写文件,此时单子可以确保按照指定的顺序执行read()函数和write()函数。

PyMonad库 下载和安装
Python 函数式复合和柯里化
Python 使用柯里化的高阶函数
Python 避易就难的柯里化
Python 函数式复合和PyMonad*运算符
Python 函子和应用型函子
Python 单子的bind()函数和>>运算符
Python 模拟实现单子
Python 单子的其他特性

Web服务的函数式设计方法

我们无须发明新的Python Web框架,也不想从可用框架中选取一个。Python中有许多可用的Web框架,并且每个框架都有各自的特性和优点。

本章旨在介绍一些适用于大多数可用框架的设计原则,它们有助于我们利用函数式设计模式呈现Web内容。

Python HTTP 请求-响应 模型
Python 通过cookie注入状态
Python WSGI标准
Python 在WSGI处理期间抛出异常
Python 实用的WSGI应用程序
Python 将Web服务定义为函数
Python 创建WSGI应用程序
Python 获取原始数据
Python 运用过滤器
Python 序列化结果
Python 序列化数据为JSON或CSV格式
Python 序列化数据为XML
Python 序列化数据为HTML
Python 跟踪使用情况

优化与改进
在大多数情况下,对程序的细小改动只能略微提升性能。用匿名函数代替函数对性能影响极小。如果程序慢到难以接受,通常必须找寻全新的算法或数据结构。用 O(n\log n) 的算法替代 O(n^2) 的算法是提升性能的最佳方式。

Python 记忆化和缓存
Python 指定记忆化
Python 尾递归优化
Python 优化存储和精度
Python 卡方决策
Python Counter过滤和约分原始数据
Python 读取汇总信息
Python Counter对象的求和计算
Python Counter对象的概率计算
Python 计算期望值
Python 计算卡方值
Python 计算卡方阈值
Python 不完全伽马函数
Python 计算完全伽马函数
Python 计算随机分布的概率
Python 函数式编程设计模式

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程