Posted at

Python 2 と 3 での高階関数の使い方の比較

More than 3 years have passed since last update.

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 の方がシンプルに書けて良い,というのが個人的な感想…


参考資料