【发布时间】:2021-05-07 17:21:00
【问题描述】:
我读过关于函数式编程的文章,它的核心概念似乎是大量使用不可变数据结构,这反过来又导致了纯函数。这些纯函数应该很容易组合,如下例所示:
def add(x, y):
return 3 + 3
def minus1(z):
return z - 1
print(minus1(add(3,3)))
我明白,我可以通过这种方法组合函数并构建新函数。在下面的例子中,我编写了两个不纯函数:
def add_list_last(arr):
arr.append(1)
return arr
def insert_entry_at_start(arr):
arr.insert(0,1)
return arr
print(add_list_last(insert_entry_at_start([1,2,3])))
为什么我不能像第二个例子那样编写不纯函数,为什么它如此强大?第二个例子的缺点是什么,为什么数组的突变会阻止可组合性?
【问题讨论】:
-
由于列表在 python 中是可变的,因此您将更改原始数组。假设您有一个名为
original的数组,并且您运行modified = add_list_last(insert_entry_at_start(original))您会期望原始数组和修改后的数组不同,但它们是完全相同的数组(不是副本,而是实际上相同的数组) -
只要函数是纯函数,您可以使用许多巧妙的技巧。但是,如果它们不纯,那么当
f(x)不再是每次都相同的操作时,这会极大地限制您。最简单的例子是 memoization - 如果f不再是 memoizable,那么你就失去了一个基本上免费的代码优化路径。 -
@VLAZ memoizable 是什么意思?
-
memoization 是一种缓存方式。您实际上构建了一个输入到输出到函数的映射。因此,如果您调用
f(1)并获得"a",则在将1传递给它时,您不需要再次重新评估f,您只需从缓存映射中获取它。但是,如果f(1)可以产生"a"或"b",那么您就无法记住该函数——相同的输入不一定会产生相同的输出。
标签: python python-3.x functional-programming