Python的functool能否减少迭代中函数的工作量?

时间:2016-08-28 02:21:19

标签: python reduce

我试图弄清楚如何在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'对象不可订阅

造成这种情况的原因是什么?

1 个答案:

答案 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