我试图弄清楚如何在Python中返回一个函数。但是,我不知道问题是reduce
还是我的代码。我现在拥有的是:
def combine(*args):
from functools import reduce
def closure(val):
return reduce( (lambda x, f: f(x)), args, val)
return closure
def first(array):
return array[0]
def shift(array):
return array[1:]
fifth = combine(first, shift, shift, shift, shift)
print(fifth([1,2,3,4,5,6,7,8,9]) # should return 5
但是,我收到错误消息:
TypeError:' int'对象不可订阅
造成这种情况的原因是什么?
答案 0 :(得分:3)
正如您在问题中定义的那样,fifth(x)
与:
fifth(x) = shift(shift(shift(shift(first(x)))))
现在,如果是x = [1,2,3,4,5,6,7,8,9]
,那么
first(x) = 1
但这意味着
shift(first(x)) = first(x)[1:] = 1[1:]
但正如错误消息告诉我们的那样,1
不是可订阅的。
我认为真正导致这种情况的原因是对reduce
命令的误解。它从左到右工作,因此首先应用给定的最左边的函数(即最里面的):
combine(a, b, c)(x) = c(b(a(x)))
如果您想要a(b(c(x)))
,则必须以相反的顺序将它们传递给combine
,或者修改combine
的定义,以便它反转参数的顺序为你:
def combine(*args):
from functools import reduce
def closure(val):
return reduce( (lambda x, f: f(x)), reversed(args), val)
return closure