mapとreduce
map
まずは標準的な使い方。
>>> map((lambda x: x ** 2), [1,2,3,4,5])
[1, 4, 9, 16, 25]
面白いのは、引数にリストを複数とれること。この場合、Haskell の zipWith 相当の動作をする。
>>> map((lambda x,y: x + y), [1,2,3,4,5], [10,20,30,40,50])
[11, 22, 33, 44, 55]
リスト3つでもいける。
>>> map((lambda x,y,z: x * y + z), [1,2,3,4,5], [6,7,8,9,10], [10,20,30,40,50])
[16, 34, 54, 76, 100]
いくつまでいけるのかは確認してない。
reduce
mapときたらreduce。injectでもfoldlでもなくreduce。何でこう、畳み込み関数って言語によって名前が違うんだろう。
>>> reduce((lambda x,y: x * y), [1,2,3,4,5], 1)
120
第3引数は省略可能で、そのときはリストの最初の値が初期値になるみたい。
>>> reduce((lambda x,y: x * y), [1,2,3,4,5])
120
この例の場合だと結果は同じだ。 追記:こういう例のほうが初期値の有無による動作の違いがわかりやすい:
>>> reduce((lambda x,y: (x,y)), [1,2,3,4,5], 0)
(((((0, 1), 2), 3), 4), 5)
>>> reduce((lambda x,y: (x,y)), [1,2,3,4,5])
((((1, 2), 3), 4), 5)
