77

Python 3.0 での reduce() 関数の変更と、それを削除する方法について、ネット上で激しい議論が繰り広げられているようです。なぜそうなるのか理解に苦しむ。いろいろな場面で使えるのはとてもいいと思います。軽蔑が単なる主観的なものであるとしたら、これほど多くの人が気にするだろうとは想像できません。

私は何が欠けていますか?reduce() の問題は何ですか?

4

5 に答える 5

77

Guido がPython 3000 での reduce() の運命の中で述べているように:

だから今reduce()。+ や * を含むいくつかの例を除けば、ほとんどの場合、重要な関数引数を指定した reduce() 呼び出しを見るたびに、ペンと紙をつかんで、ペンと紙をつかむ必要があるためです。 reduce() が何をすべきかを理解する前に、その関数に実際に何が供給されているかを図解してください。私の考えでは、reduce() の適用可能性は連想演算子にかなり限定されており、それ以外の場合はすべて、累積ループを明示的に書き出す方が適切です。

関数型プログラミングの HOWTO記事reduceには、混乱を招く優れた例があります。

次のコードは何をしていますか?

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 ループとして記述するとより明確になります。

于 2008-10-08T07:42:12.293 に答える
36

reduce()は削除されていませんfunctools。モジュールに移動されているだけです。Guido の推論は、総和のような些細なケースを除いて、reduce()通常、累積ループとして記述されたときに、コードを使用して記述された方が明確になるというものです。

于 2008-10-08T07:20:43.803 に答える
9

人々は、より明確な方法で達成できることを行う、難読化されたスタイルのプログラミングを助長するのではないかと心配しています。

私は自分自身を削減することに反対ではありません。また、それが便利なツールである場合もあります。

于 2008-10-08T06:53:54.417 に答える