我有一个编写高阶函数(函数1)的代码。但是,我不知道为什么我应该这样写而不是正常的(功能2)。如果有人能在高阶函数更好的时候给我看,我真的很感激。
# Function 1 (High order):
def high_function (L):
def function (x):
total = 0
for i in range(len(L)):
total = total + x **(len(L) - 1 - i) * L[i]
return total
return function
# Function 2 (Normal):
def high_function (L, x):
total = 0
for i in range(len(L)):
total = total + x **(len(L) - 1 - i) * L[i]
return total
答案 0 :(得分:2)
首先,为您的功能提供更好的名称,以便更清楚地使用:
def polynomial(factors):
def eval(x):
result = 0
for factor in factors:
result = x * result + factor
return result
return eval
因此该函数用于定义多项式,可用于评估不同的x
:
parabola = polynomial([1, 0, 0])
并在其他地方使用它:
value = parabola(0.4)
答案 1 :(得分:0)
我缺乏函数式编程的正式知识,但实质上,具有更高阶函数允许您根据需要创建函数并将它们传递给其他更高阶函数。
就像对象可以接受其他对象一样,将函数视为一等公民的语言允许将函数传递给其他函数。
考虑这个例子,
def add(a):
def func(b):
return a + b
return func
此add
函数可用于根据需要创建函数
twoMore = add(2)
x = 10
xPlusTwo = twoMore(x)
请注意,在函数内创建函数时,内部函数位于闭包内,并且可以访问外部函数的作用域。对于add
函数,内部func
在a
返回并在add
中使用时,可以访问twoMore
。
总结我关于传递函数的观点,请考虑另一个例子
def filter_list(valid, list):
return [item for item in list
if valid(item)]
def is_greater_than(value):
def func(item):
return item > value
return func
my_list = [1,2,3,4,5,6,7]
gt5 = is_greater_than(5)
new_list = filter_list(gt5, my_list)