28

Python 3.3 ではitertools.accumulate()、通常、提供された iterable に加算演算を繰り返し適用する が、関数の引数をパラメーターとして受け取ることができるようになりました。これは、 と重なっているということfunctools.reduce()です。大雑把に見ると、現在の 2 つの主な違いは次のようになります。

  1. accumulate()デフォルトは合計ですが、追加の初期条件を明示的にreduce()指定することはできませんが、どのメソッドもデフォルトではありませんが、1/0 要素シーケンスで使用するための初期条件を指定できます。
  2. accumulate()最初に iterable をreduce()取り、最初に関数を取ります。

2つの間に他に違いはありますか?それとも、最初は別々の用途で使用されていた 2 つの関数の動作の問題であり、時間の経過とともに収束し始めているのでしょうか?

4

3 に答える 3

32

accumulateは以前の結果を保持しているように見えますが、 reduce(他の言語ではフォールドとして知られている) は必ずしもそうではありません。

たとえば、プレーンフォールドがlist(accumulate([1,2,3], operator.add))返さ[1,3,6]れるのに対し、返されます6

また、(楽しみのために、これをしないでください)次accumulateの観点から定義できますreduce

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返します。すべての中間結果に対してイテレータを返します。基本的に、操作の各ステップの結果に対してイテレータを返します。accumulateaccumulatereduce

于 2013-01-03T03:28:11.217 に答える
6

itertools.accumulatereduceていますが、値の代わりに generator* を返します。このジェネレーターは、すべての中間ステップ値を提供できます。したがって、基本的に reduce は、accumulate が提供する最後の要素を提供します。

*ジェネレーターはイテレーターに似ていますが、反復できるのは 1 回だけです。

于 2016-05-14T16:24:27.047 に答える