itertools.accumulate()与functools.reduce()的比较

2024-05-16 20:33:37 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 3.3中,^{}通常重复对提供的iterable应用加法操作,现在可以将函数参数作为参数;这意味着它现在与^{}重叠。粗略地看一下,两者现在的主要区别似乎是:

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

这两者还有什么区别吗?或者这仅仅是两个函数的行为问题,它们最初的不同用途随着时间的推移开始收敛?


Tags: 方法函数元素reduce参数时间序列函数参数
3条回答

您可以在文档中看到不同之处。reduce返回序列的一个结果、和、积等。accumulate返回中间结果上的迭代器。基本上,accumulate返回对reduce操作的每个步骤的结果的迭代器。

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

例如,list(accumulate([1,2,3], operator.add))将返回[1,3,6],而普通褶皱将返回6

另外(只是为了好玩,不要这样做)您可以用reduce定义accumulate

def accumulate(xs, f):
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 

itertools.accumulate 类似于reduce,但返回生成器*而不是值。这个生成器可以提供所有中间阶跃值。所以基本上,reduce给了你最后一个元素,就是积累会给你的东西。

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

相关问题 更多 >