Pythonの高階関数(map, filter, reduce)

はじめに

みなさん

  • map
  • filter
  • reduce
    といった高階関数を使いこなせていますか?

これらは最初は少し難しく感じますが、使いこなせるようになるとても便利です。

ぜひ習得しましょう。

高階関数とは

よく高階関数の代表として

  • map
  • filter
  • reduce
    が紹介されますが、これらは高階関数の一部にすぎません。

高階関数とは、関数を引数や返り値に取ることができる関数のことで、
Pythonでは高階関数を扱うことができます。

例を見てみましょう。

1
2
3
4
5
6
7
8
9
def func():
print (1)

def high_func(func):
def return_func(func):
print (0)
func()
print (2)
return return_func(func)

関数func()を宣言します。
1を出力するだけの関数です。

次に高階関数high_func()をみてみましょう。

まず、関数内で関数return_func()を宣言し、それを返却していることがわかります。

また、high_func()が引数として受け取っているfuncは、関数であることがわかりますね。

(さらにreturn_func()も関数funcを受け取っていますね)

結果を見て見ましょう。

1
2
3
4
>>> high_func(func)
0
1
2

このように元の関数func()の処理に加工を加えることができました。

高階関数はとても便利だと感じていただけたでしょう。

では、ここからはタイトルの通り

  • map
  • filter
  • reduce

を見ていきましょう。

これらは組み込み関数や標準ライブラリとして実装されています

map

mapはシーケンスの各要素に対して関数を適用し、シーケンスを得る関数です。
最も代表的なシーケンスと言えるリストで動作を確認してみましょう。

コードの全体像

1
2
3
4
def square(x):
return x*x
A = [2, 3, 5]
list(map(square, A))

解説

mapは関数を引数に取るので、まずは関数を作りましょう。

ここでは、数の二乗を計算する関数を考えます。

1
2
def square(x):
return x*x

mapはさらにシーケンスを引数に取るので、リストを作成しましょう。

1
list(map(square, A))

そしてmapの第一引数に関数を、第二引数にリストを与えれば、OKです。

やや複雑ですが、mapmapを返却するため、それをリストに変換する必要があります。

1
[4, 9, 25]

この結果が得られれば成功です。

filter

filterはシーケンスの各要素に対して関数を適用し、真である要素のシーケンスを得る関数です。

コードの全体像

1
2
3
4
def is_odd(x):
return bool(x % 2)
A = [2, 3, 5]
list(filter, A)

解説

1
2
def is_odd(x):
return bool(x % 2)

is_oddは奇数であればTrue、そうでなければFalseを返す関数です。

これは2の剰余を用いることで実装することができますね。

最後に明示的にbool型に変換をし、返却しています。

1
list(filter(is_odd, A))

filtermapと同じく、最後にリストに変換する必要があります。

reduce

これは組み込み関数ではなく、標準ライブラリfunctoolsに実装されている。
reduceは、二つの要素に対して関数を適用し一つの要素にする操作を繰り返すことで、シーケンスを単一の値に変換する関数です。

これを使って、リストの和を計算する関数を実装してみましょう。

色々な方法でリストの総和を求めるのコードを参考にしていますので、合わせてどうぞ。

コードの全体像

1
2
3
4
5
6
from functools import reduce
def my_sum(lst):
def add(a, b):
return a+b
return reduce(add, lst)
my_sum(A)

解説

標準ライブラリfunctoolsにあるreduceをインポートする。

1
from functools import reduce

和を計算する関数my_sumを宣言している。この関数は引数として、リストを受け取る。

関数内部で足し算を行う関数addを宣言している。

addを第一引数に、リストを第二引数にしてreduceを行い、得られた単一の値を返却している。

``

1
2
3
4
def my_sum(lst):
def add(a, b):
return a+b
return reduce(add, lst)

最後に完成した関数を呼び出す。

1
my_sum(A)

まとめ

高階関数について、また有名な高階関数である

  • map
  • filter
  • reduce

について説明をした。

記事情報

  • 投稿日:2020年3月17日
  • 最終更新日:2020年3月17日