Python を使うたびに,高階関数 (map,filter,reduce) の使い方を調べたりしているので,メモとして残しておきます.
また,最近 Python 3 の勉強を始めたのですが,Python 2 と 3 では書き方が多少異なるため,比較のために両方書いておきます.
そもそも高階関数が何かというと,関数を引数として受け取る関数のこと.
例えば,配列の各要素に対して,何らかの処理をしたいときなどに使うもの.
実行環境
- Mac OS X Yosemite 10.10.2
- Python 2.7.6
- Python 3.5.1
map 関数
配列の全ての要素に対して処理をしたいときに使う.
以下の例では,配列の全ての要素を 2 倍して出力する.
- Python 2
print map(lambda x: x * 2, range(1, 5))
- Python 3
print (list(map(lambda x: x * 2, range(1, 5))))
- 実行結果
[2, 4, 6, 8]
filter 関数
配列の中で条件にマッチした要素にのみ処理をしたいときに使う.
以下の例では,配列の要素から偶数のみを抽出する.
- Python 2
print filter(lambda x: x % 2 == 0, range(1, 5))
- Python 3
print (list(filter(lambda x: x % 2 == 0, range(1, 5))))
- 実行結果
[2, 4]
reduce 関数
複数の要素を 1 つにまとめたいときに使う.
具体的には,配列の先頭から 2 つの要素を取り出して処理を行い,次はその結果とその次の要素に処理を行う,ということを繰り返す.
しかし,Python 3 では reduce 関数は Python のコア関数からはずされており,functools モジュールをインポートしないと使えなくなっている.
以下の例では,配列の全ての要素の合計を出す.
- Python 2
print reduce(lambda x, y: x + y, range(1, 5))
- Python 3
import functools
print (functools.reduce(lambda x, y: x + y, range(1, 5)))
- 実行結果
10
Python 3 に慣れていないせいもあるが,Python 2 の方がシンプルに書けて良い,というのが個人的な感想…