itertools.accumulate() versus functools.reduce()
It seems that accumulate
keeps the previous results, whereas reduce
(which is known as fold in other languages) does not necessarily.
e.g. list(accumulate([1,2,3], operator.add))
would return [1,3,6]
whereas a plain fold would return 6
Also (just for fun, don't do this) you can define accumulate
in terms of reduce
def accumulate(xs, f):
return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]])
itertools.accumulate
is like reduce
but returns a generator* instead of a value. This generator can give you all the intermediate step values. So basically reduce gives you the last element of what accumulate will give you.
*A generator is like an iterator but can be iterated over only once.
You can see in the documentation what the difference is. reduce
returns a single result, the sum, product, etc., of the sequence. accumulate
returns an iterator over all the intermediate results. Basically, accumulate
returns an iterator over the results of each step of the reduce
operation.