はじめに
みなさん
- map
- filter
- reduce
といった高階関数を使いこなせていますか?
これらは最初は少し難しく感じますが、使いこなせるようになるとても便利です。
ぜひ習得しましょう。
高階関数とは
よく高階関数の代表として
- map
- filter
- reduce
が紹介されますが、これらは高階関数の一部にすぎません。
高階関数とは、関数を引数や返り値に取ることができる関数
のことで、
Pythonでは高階関数を扱うことができます。
例を見てみましょう。
1 | def func(): |
関数func()
を宣言します。1
を出力するだけの関数です。
次に高階関数high_func()
をみてみましょう。
まず、関数内で関数return_func()
を宣言し、それを返却していることがわかります。
また、high_func()
が引数として受け取っているfunc
は、関数であることがわかりますね。
(さらにreturn_func()
も関数func
を受け取っていますね)
結果を見て見ましょう。
1 | >>> high_func(func) |
このように元の関数func()
の処理に加工を加えることができました。
高階関数はとても便利だと感じていただけたでしょう。
では、ここからはタイトルの通り
- map
- filter
- reduce
を見ていきましょう。
これらは組み込み関数や標準ライブラリとして実装されています
map
map
はシーケンスの各要素に対して関数を適用し、シーケンスを得る関数です。
最も代表的なシーケンスと言えるリストで動作を確認してみましょう。
コードの全体像
1 | def square(x): |
解説
map
は関数を引数に取るので、まずは関数を作りましょう。
ここでは、数の二乗を計算する関数を考えます。
1 | def square(x): |
map
はさらにシーケンスを引数に取るので、リストを作成しましょう。
1 | list(map(square, A)) |
そしてmap
の第一引数に関数を、第二引数にリストを与えれば、OKです。
やや複雑ですが、map
はmap
を返却するため、それをリストに変換する必要があります。
1 | [4, 9, 25] |
この結果が得られれば成功です。
filter
filter
はシーケンスの各要素に対して関数を適用し、真である要素のシーケンスを得る関数です。
コードの全体像
1 | def is_odd(x): |
解説
1 | def is_odd(x): |
is_odd
は奇数であればTrue
、そうでなければFalse
を返す関数です。
これは2の剰余を用いることで実装することができますね。
最後に明示的にbool型に変換をし、返却しています。
1 | list(filter(is_odd, A)) |
filter
もmap
と同じく、最後にリストに変換する必要があります。
reduce
これは組み込み関数ではなく、標準ライブラリfunctools
に実装されている。reduce
は、二つの要素に対して関数を適用し一つの要素にする操作を繰り返すことで、シーケンスを単一の値に変換する関数です。
これを使って、リストの和を計算する関数を実装してみましょう。
色々な方法でリストの総和を求めるのコードを参考にしていますので、合わせてどうぞ。
コードの全体像
1 | from functools import reduce |
解説
標準ライブラリfunctools
にあるreduce
をインポートする。
1 | from functools import reduce |
和を計算する関数my_sum
を宣言している。この関数は引数として、リストを受け取る。
関数内部で足し算を行う関数add
を宣言している。
add
を第一引数に、リストを第二引数にしてreduce
を行い、得られた単一の値を返却している。
``
1 | def my_sum(lst): |
最後に完成した関数を呼び出す。
1 | my_sum(A) |
まとめ
高階関数について、また有名な高階関数である
- map
- filter
- reduce
について説明をした。
記事情報
- 投稿日:2020年3月17日
- 最終更新日:2020年3月17日