1. ホーム
  2. python

reduce()の問題点は何ですか?

2023-10-13 18:10:40

質問

Python 3.0のreduce()関数の変更について、ネット上で多くの熱い議論が交わされているようです。私は、なぜそうなのか少し理解に苦しみます。私は、さまざまなケースでそれを使用することは非常に合理的であると思います。もし侮辱が単に主観的なものであったなら、これほど多くの人がそれを気にすることは想像できません。

私は何を見逃しているのでしょうか?reduce()の何が問題なのでしょうか?

どのように解決するのですか?

Guidoが彼の Python 3000におけるreduce()の運命 の投稿で述べています。

さて、次はreduce()です。なぜなら、+ や * を含むいくつかの例を除いて、ほとんど毎回、自明ではない関数の引数で reduce() を呼び出すのを見るたびに、reduce() が何をすることになっているのかを理解する前に、実際にその関数に何が供給されているかを紙とペンで図にしなければならないからです。私の考えでは、reduce()の適用範囲は連想演算子にかなり限定されており、他のすべてのケースでは蓄積ループを明示的に書き出す方がよいでしょう。

混乱させるような優れた例として reduce の中に 関数型プログラミングHOWTO の記事を参照してください。

<ブロッククオート

早速ですが、以下のコードは何をしているのでしょうか?

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]

解るけど、解るようになるまでには時間がかかる。 を解くのに時間がかかります。短いネストしたdef文を使うと、少しはマシになります。

def combine (a, b):
    return 0, a[1] + b[1]

total = reduce(combine, items)[1]

でも、単純にforループを使っていれば一番いいんですけどね。

total = 0
for a, b in items:
    total += b

あるいは、sum()組み込みとジェネレータ式。

total = sum(b for a,b in items)

reduce()の多くの用途は、forループとして書かれるとより明確になります。