选自 Medium
作者:Raivat Shah
参与:魔王、Jamin
本文对 Python 中的函数式编程技术进行了简单的入门介绍。
近来,慢慢的变多人使用函数式编程(functional programming)。因此,很多传统的命令式语言(如 Java 和 Python)开始支持函数式编程技术。本文对 Python 中的函数式编程技术进行了简单的入门介绍。
本文适合对函数式编程有基本了解的读者。如果你对函数式编程并不熟悉,可以先阅读这篇文章:https://medium.com/@yannickdot/functional-programming-101-6bc132674ec5。
本文作者是新加坡国立大学计算机学院和「USP」博学计划学生 Raivat Shah,专注于编程与数据研究。
头等函数
在 Python 中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如 int)处于平等地位。
因而,我们大家可以将函数赋值给变量,也可以将其作为参数传入其他函数,将它们存储在其他数据结构(如 dicts)中,并将它们作为其他函数的返回值。
把函数作为对象
由于其他数据类型(如 string、list 和 int)都是对象,那么函数也是 Python 中的对象。我们来看示例函数 foo,它将自己的名称打印出来:
由于函数是对象,因此我们大家可以将函数 foo 赋值给任意变量,然后调用该变量。例如,我们大家可以将函数赋值给变量 bar:
语句 bar = foo 将函数 foo 引用的对象赋值给变量 bar。
把对象作为函数
当对象可调用时(callable),它们与函数一样,如 object()。这是通过 __call__ 方法实现的。
示例如下:
每一次配置 Greeter 类的对象时,我们都会创建一个新的对象,即打招呼时可以喊的新名字。如下所示:
我们大家可以调用 morning 对象的原因主要在于,我们已在类定义中使用了 __call__ 方法。为了检查对象是否可调用,我们使用内置函数 callable:
数据结构内的函数
函数和其他对象一样,可以存储在数据结构内部。例如,我们大家可以创建 int to func 的字典。当 int 是待执行步骤的简写时,这就会派上用场。
类似地,函数也可以存储在多种其他数据结构中。
把函数作为参数和返回值
函数还可当作其他函数的参数和返回值。接受函数作为输入或返回函数的函数叫做高阶函数,它是函数式编程的重要组成部分。
高阶函数具备强大的能力。就像《Eloquent Javascript》中解释的那样:
「高阶函数允许我们对动作执行抽象,而不只是抽象数值。」
我们来看一个例子。假设我们想对一个项目列表(list of items)执行迭代,并将其顺序打印出来。我们大家可以轻松构建一个 iterate 函数:
看起来很酷吧,但这仅仅是一级抽象而已。如果我们想在对列表执行迭代时进行打印以外的其他操作要怎么做呢?
这就是高阶函数存在的意义。我们大家可以创建函数 iterate_custom,待执行迭代的列表和要对每个项应用的函数都是 iterate_custom 函数的输入:
这看起来微不足道,但其实非常强大。
我们已把抽象的级别提高了一层,使代码具备更强的可重用性。现在,我们不但可以在打印列表时调用该函数,还可以对涉及序列迭代的列表执行任意操作。
函数还能被返回,从而使事情变得更简单。就像我们在 dict 中存储函数一样,我们还可以将函数作为控制语句,来决定适合的函数。例如:
嵌套函数
函数还可以在其他函数内部,这就是「内部函数」。内部函数在创建辅助函数时非常有用,辅助函数即作为子模块来支持主函数的小型可重用函数。
在问题需要特定函数定义(参数类型或顺序)时,我们大家可以使用辅助函数。这种不遵循传统做法的操作使得处理问题变得更简单,示例参见:http:///blog/python/functional-programming/
Functional Programming Tutorials and Notes:https:///zh/practice/python/functional-programming/functional-programming-1/tutorial/
本文为机器之心编译,转载请联系本公众号获得授权。
------------------------------------------------