関数型言語、関数型プログラミングについて少し興味があり昨日今日と少し調べて解説記事などを眺めていました。その中で出てきた高階関数というのは Python でもあったなと思い、調べておきます。
高階関数とは「関数を引数に取ったり、戻り値として関数を返したりするような関数」のことを指します。何となく map とか reduce とかそういう感じかなと思ったのですがそれらに限定されるものではないですね。
「パーフェクト Python」にあった例を試してみます。 まず、普通に for ループで書く場合はこうなります。
# 素直にループで書く
def pick_odd(seq):
ret = []
for item in seq:
if item % 2 == 1:
ret.append(item)
return ret
# シーケンスを作成
seq = [x for x in range(30)]
# 結果を表示
print(pick_odd(seq))
次により小さな関数に分解して書いてみます。
# 奇数かどうかを判定
def is_odd(item):
return item % 2 == 1
# シーケンスに対して条件を適用
def filter(pred, seq):
ret = []
for item in seq:
if pred(item):
ret.append(item)
return ret
# 両者を組み合わせる
def pick_odd2(seq):
return filter(is_odd, seq)
いずれも同じ結果が返ってきます。こちらの方がモジュール化が進んでいて機能変更にも強そうですね。(偶数をピックアップすることになったなら is_even(item) を書いて差し替えればよいでしょう)
「パーフェクト Python」では高階関数それ自体についての解説はさらっとしか書かれていないので web と両方を用いながら学んでいきたいと思います。