Python 函数式编程设计模式

Python 函数式编程设计模式,函数式编程有许多常用的设计模式,都是能在各种场景中使用的典型函数式编程方法。

请注意它与面向对象设计模式的主要区别。许多面向对象设计模式旨在使状态管理更加明确,或者协助构建复杂的紧急行为。函数式设计模式的重在从简单形式创建出复杂行为。

本教程介绍了许多常用的函数式设计方法,其中大多数尚未给出专有的名称或来历。本节将回顾其中一些模式。

  • 柯里化:可以在偏函数应用中调用它,并由functools模块中的partial()函数来实现,其思想是基于现有的函数并加上一些(并非全部)函数参数来创建新函数。
  • 闭包:在Python中,很容易定义一个返回另一个函数的函数。当返回的函数包含外部函数绑定的变量时,它就是一个闭包。通常在函数返回匿名对象或生成器表达式时完成。也可以将它作为创建参数化装饰器的一部分来实现。
  • 纯函数:常用的无状态函数。在Python中,还可以使用非纯函数来处理有状态的输入和输出。此外,系统服务和随机数生成器属于非纯函数的例子。好的函数式设计往往强调尽量使用纯函数,而避免使用global语句。
  • 函数式复合itertools库包含了许多函数式复合的工具。前面介绍了使用装饰器进行函数式复合的方法。在许多情况下,创建可调用的对象可便于在运行时将这些函数绑定在一起。
  • 高阶函数:Python有许多使用其他函数的内置函数,包括map()filter()min()max()sorted()。此外,functools库和itertools库中还包含其他一些示例。
  • Map-Reduce算法:很容易通过高阶函数构建得到。在Python中,它们相当于reduce(f, map(g, data))的变体。可以使用函数f()来处理归约,使用函数g()来执行逐项映射。常见的归约例子包括sum(),以及statistics库中的许多函数。
  • 惰性(非严格)求值:例如Python生成器表达式。像表达式(f(a) for a in S)就是惰性的,只会在客户端操作取值后才对f(a)进行求值。许多示例使用了list()函数从惰性生成器中取值。
  • 单子:由于在Python中对运算进行排序是不可避免的,因此通常不必强制指定执行顺序,可以使用pymonad库提供的一些显式语法来清楚地说明如何在更复杂的表达式中进行排序。这有助于输入和输出,对具有状态化行为的复杂模拟也是有益的。

除了这些常用的函数式编程设计模式之外,Python中还有其他一些技术适用于函数式编程:

  • 将尾递归转换为for语句:Python对递归设置了上限,且很少有循环允许超过此上限。更重要的是,递归涉及管理栈帧的开销,这在for语句中是可以避免的。
  • 可迭代函数:使用yield from语句可以轻松创建出由其他函数结果组成的可迭代集合函数。使用可迭代对象结果有助于函数式复合。
  • Python装饰器和可调用对象可以作为函子。在类ML语言中,函子用于将类型定义作为参数。在Python中,类型定义通常是基于类的,而且明智的做法是将这些定义与可调用对象或装饰器结合起来。

所有这些函数式设计模式都可以描述为设计和实现函数式编程的典型方法或常用方法。任何一种频繁重复的设计都会形成一种模式,我们可以从中学习并将其应用于自己的软件设计。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程