1. ホーム
  2. python

[解決済み] 関数型プログラミングの「fold」関数に相当する「pythonic」関数は何ですか?

2022-03-07 07:50:16

質問

Haskellで次のようなことを実現する最も慣用的な方法は何でしょうか。

foldl (+) 0 [1,2,3,4,5]
--> 15

またはRubyでの同等品。

[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15

当然ながら、Pythonは reduce 関数は、まさに上記のように fold を実装したものですが、私は、「パイソン的」なプログラミングのやり方としては lambda 項や高階の関数を使用し、可能な限りリストで表現することを好みます。したがって、Pythonでリストまたはリストのような構造を折りたたむのに reduce 関数、または reduce を実現するための慣用的な方法ですか?

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

Pythonicな方法で配列の和をとるには、次のようにします。 sum . その他の用途では、以下のような組み合わせを使用することができます。 reduce (から)。 functools モジュール)と operator モジュールなどです。

def product(xs):
    return reduce(operator.mul, xs, 1)

注意すること reduce は、実際には foldl Haskellの用語で言うと フォールドを実行するための特別な構文はなく、ビルトインの foldr を使用し、実際に reduce を非結合演算子で使用することは、悪いスタイルと考えられています。

高階の関数を使うのは、Pythonの「関数やクラスも含めてすべてがオブジェクトである」という原則をうまく利用したもので、非常にPythonicです。ラムダが一部のPythonistに嫌われているのは正しいのですが、その理由のほとんどは、複雑になるとあまり読みやすくなくなる傾向があるためです。