人気ブログランキング | 話題のタグを見る

reduce()

Python 3.6 の組み込み関数からは reduce() が削除されていたので作ってみた。

>>> def reduce(f,x,xs):
...     for y in xs:
...         x = f(x,y)
...     return x
...
>>> reduce(lambda x,y: x+y, 0, [1,2,3,4,5])
15
>>> reduce(lambda x,y: x*y, 1, [1,2,3,4,5])
120

これは Haskell の foldl に相当する。f(x,y) = x+y, x =0, xs = [1,2,3,4,5] の場合この関数は次のような計算になる。

reduce(f,0,[1,2,3,4,5]) = (((((0+1)+2)+3)+4)+5)

つまり、リスト [1,2,3,4,5] の要素を先頭からアキュームレータ x に加算していく。Haskell の場合は変数への再代入ができないので、右項の計算式を展開していってリストの最後まで展開していった時点で式の計算を行っている。Python のような手続き型言語は、変数への再代入が可能なので明示的に x をアキュームレータにしてループを回すことで計算できる。

Haskell のリスト関連の関数で、foldr, foldl は難解なほうだが、手続き型の言語と比較することで、その意味がよくわかる。

reduce と foldl のような等価な動作をする関数を関数型と手続き型とで対比することによって、それぞれのコードの意味がよくわかるのが面白い。

by tnomura9 | 2018-01-06 19:12 | Python | Comments(0)
<< list.pop() Python のリスト処理 >>