参与:魔王、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
函数 foo 引用的对象, 被赋值给变量 bar, 语句是 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-2×3.pdf。
假想一下, 你打算去定义这么一个只带有一个参数 n 的斐波那契函数 fib(n), 于此函数而言, 我们是一定得返回那第 n 个斐波那契数呀。
要定义此类函数, 有一种可行的方式, 那就是, 借用辅助函数来追踪斐波那契数列的前两个数, 这是因为, 斐波那契数乃是前两个数相加所得的和哟。
def fib(n):
def (fk1, fk, k):
if n == k:
fk
else:
(fk, fk1+fk, k+1)
if n





