参与:魔王、Jamin
本文对 中的函数式编程技术进行了简单的入门介绍。
近来, 有越来越多的人去使用函数式编程()。从而, 具有很多传统性质的命令式语言(像是 Java 和)开始去支持函数式编程技术。本文针对 当中的函数式编程技术开展了简单的入门介绍。
本文适合那些, 对函数式编程有着基本了解的读者。而要是你, 对函数式编程并不熟悉, 那么可以先去阅读这篇文章: @/--101-。

本文作者乃是新加坡国立大学计算机学院的学生, 也是「USP」博学计划里的学生Shah, 其专注于编程方面, 还专注于数据研究方面。
头等函数
在其中, 函数属于「头等公民」(first-class), 这意味着, 函数跟其他数据类型(像 int)处在平等的位置。
因而, 我们能够把函数赋予变量, 还可把函数当作参数传递给其他函数, 将函数存储于其他数据结构(像dicts)里, 并且把函数作为其他函数的返回值。
把函数作为对象
因其他数据类型(像 、list 以及 int)皆为对象, 所以函数同样也是 里边的对象。我们瞧瞧示例函数 foo, 它会把自身的名称给打印出来:
def foo():
print("foo")
因为函数属于对象范畴, 所以我们能够把函数foo指派给随便哪一个变量, 接着去调用那个变量。比如说, 我们能够将函数赋予变量bar:
bar = foo
bar()
#will print "foo" to the
变量bar被赋予了函数foo所引用的对象, 通过语句bar = foo来达成这种赋值操作。
把对象作为函数
在对象能够被调用的情形下, 它们跟函数是一样的, 就如同这般。而这是借助方法达成的。
示例如下:
class :
def (self, ):
self. =
def (self, name):
self. + " " + name
每一回进行配置, 那属于类的对象之际, 我们都会去创立一个全新的对象, 也就是在打招呼之时能够呼喊的全新名字, 如下面所展示的这样:
= ("good ") # the
("john") # the
"good john" to the
原因是我们 在类定义里运用了 方法, 所以我们能够调用 对象。为了查验对象可不可以被调用, 我们借助内置函数:
() #true
(145) #false. int is not .
数据结构内的函数
函数跟其他对象没什么两样, 能够被存储于数据结构的内部。举例来讲, 我们能够创建一种字典, 其键是int类型, 值是func类型。当int作为待执行步骤的一种简化缩写形式的时候, 这样的字典就能发挥作用了。
store in
= {
0 : foo,
1 : bar
先是, x 被赋予输入的值, 此值是从用户那里获取得到的, 通过 input 这个方法, 让用户进行输入。
() #call the func by
类似地,函数也可以存储在多种其他数据结构中。
把函数作为参数和返回值
函数能够作为别的函数的参数以及返回值, 接收函数当作输入或者返回函数的这种函数称作高阶函数, 它堪称函数式编程的相当重要的构成部分。
高阶函数具备强大的能力。就像《 》中解释的那样:
「高阶函数允许我们对动作执行抽象,而不只是抽象数值。」
需注意, 这里是要对一个项目列表, 也就是 list of items, 执行的是迭代操作, 并且要把该列表的项目顺序打印出来。我们能够很容易地构建出一个函数 , 现在我们来看一个例子。
def ():
for item in :
print(item)
看来显得挺酷滴是不是, 然而这仅仅只是一级抽象罢了。要是咱们想要在针对列表开展迭代之际进行打印之外的别的操作那该如何去做?
这便是高阶函数所具备的存在意义, 我们能够去创建函数, 有待用于执行迭代的列表乃是函数的输入之一, 还有要针对每个项加以应用的函数同样是函数的输入。
def (, ):
for item in :
(item)
这看起来微不足道,但其实非常强大。
我们已然将抽象的层级提升了一级, 从而让代码拥有了更为强大的可重用性能。当下, 我们不但能够在打印列表之际调用那个函数, 而且还能够对于涉及序列迭代的列表去施行任意的操作。
函数居然能够被返回, 进而致使事情朝着愈发简单的方向发展, 如跟我们于dict里头存储函数这般, 我们还可以把函数当作控制语句, 能够借此去判定适宜的函数, 像这样举例: 。
def add(x, y):
x + y
def sub(x, y):
x - y
def mult(x, y):
x * y
def ():
if == 1:
add
elif == 2:
sub
else:
mult
= (2) #my calc is a
(5, 4) # 5 - 4 = 1
= (9) #my calc is now a
(5, 4) # 5 x 4 = 20.
嵌套函数
函数能够处于别的函数之中, 此乃「内部函数」。内部函数于创建辅助函数之际用处极大, 辅助函数乃是当作子模块用以支撑主函数的小型可重用函数。
在问题要求特定函数定义, 也就是参数类型或者顺序时, 我们能够使用辅助函数, 这种不依照传统做法的操作, 致使解决问题变得更为简单, 示例可参见: ~cs61a/sp12//lect4-2x3.pdf。
假如你打算去定义一个名为 fib(n) 的斐波那契函数, 这个函数仅仅存在一个参数 n, 那么我们必然要去返回第 n 个斐波那契数。
以此种函数的一个可行定义途径来讲, 是运用辅助函数去跟踪斐波那契数列里的前两项, 毕竟斐波那契数乃是前两个数相互加和而得, 是这样的情况。
def fib(n):
def (fk1, fk, k):
if n == k:
fk
else:
(fk, fk1+fk, k+1)
if n