在Python 3.3中,itertools.accumulate()
通常会重复对提供的iterable应用加法运算,现在可以将函数参数作为参数;这意味着它现在与functools.reduce()
重叠。粗略看一下,两者之间的主要区别似乎是:
accumulate()
默认为求和但不允许您明确提供额外的初始条件,而reduce()
不默认为任何方法,但允许您提供初始条件以用于1/0 - 元素序列和accumulate()
首先获取可迭代,而reduce()
首先获取该函数。两者之间是否存在其他差异?或者这仅仅是两个函数的行为问题,最初的不同用途开始随时间收敛?
答案 0 :(得分:21)
似乎accumulate
保留了以前的结果,而reduce
(在其他语言中称为fold)并不一定。
e.g。 list(accumulate([1,2,3], operator.plus))
将返回[1,3,6]
,而普通折叠将返回6
另外(只是为了好玩,不要这样做)你可以用accumulate
reduce
def accumulate(xs, f):
return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]])
答案 1 :(得分:5)
您可以在文档中看到有什么区别。 reduce
会返回单个结果,即序列的总和,产品等。 accumulate
通过 all 返回中间结果的迭代器。基本上,accumulate
会在reduce
操作的每个步骤的结果上返回迭代器。
答案 2 :(得分:3)
itertools.accumulate
与reduce
类似,但返回生成器*而不是值。该生成器可以为您提供所有中间步骤值。所以基本上减少会给你积累的最后一个元素。
*生成器就像一个迭代器,但只能迭代一次。