28

在 Python 3.3 中itertools.accumulate(),通常重复地对提供的迭代应用加法运算,现在可以将函数参数作为参数;这意味着它现在与functools.reduce(). 粗略一看,现在两者之间的主要区别似乎是:

  1. accumulate()默认为求和,但不允许您显式提供额外的初始条件,reduce()而不默认为任何方法,但允许您提供用于 1/0 元素序列的初始条件,并且
  2. accumulate()先取可迭代,先reduce()取函数。

两者之间还有其他区别吗?或者这只是两个函数的行为问题,最初不同的用途开始随着时间的推移而收敛?

4

3 回答 3

32

似乎accumulate保留了以前的结果,而reduce(在其他语言中称为折叠)不一定。

例如list(accumulate([1,2,3], operator.add))会返回[1,3,6],而普通折叠会返回6

另外(只是为了好玩,不要这样做)你可以定义accumulatereduce

def accumulate(xs, f):
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 
于 2013-01-03T03:26:32.197 回答
8

您可以在文档中看到有什么区别。 reduce返回序列的单个结果、总和、乘积等。 返回所有中间结果accumulate的迭代器。基本上,在操作的每个步骤的结果上返回一个迭代器。accumulatereduce

于 2013-01-03T03:28:11.217 回答
6

itertools.accumulate 就像reduce但返回一个生成器*而不是一个值。该生成器可以为您提供所有中间步骤值。所以基本上 reduce 给了你积累的最后一个元素。

*生成器类似于迭代器,但只能迭代一次。

于 2016-05-14T16:24:27.047 回答