高階関数
何やらいかつい名前のやつが出てきた。
インスパイヤ先⇒お気楽 Python プログラミング入門:第3回再帰定義と高階関数
Python は手続き型言語ですが、Lisp などの関数型言語のように、関数を変数に代入したり、引数として渡すことができます。また、値として関数を返すこともできるので、関数を作る関数を定義することができます。関数を引数として受け取る関数を「高階関数 (higher order function) 」と呼びます。
これってこの前id:morchinさんがコメントで触れてくれてたこと
また、ここでの_permutationは、ローカル変数であり属性ではありません。
あたりと関係あるんかなぁとか思いつつ読んでみた。
ふむふむ。
これはなかなか斬新な発想だなぁ。
てなわけで、紹介されていたmap()とfilter()とreduce()の実装をリスト内包なんかを使ってPythonちっくに書いてみる。
そして実際の高階関数と比較してみる。
# map() demo def square(x): return x*x def mapcar(func, ls): return [func(x) for x in ls] # filter() demo def isOdd(x): return x % 2 == 0 def remove_if(func, ls): return [x for x in ls if func(x)] # reduce() demo def plus(x, y): return x+y def fold(func, ls, init = 0): a = init for x in ls: a = func(a,x) return a def main(): numList = [1,2,3,4,5] print mapcar(square, numList) print map(square, numList) print print remove_if(isOdd, numList) print filter(isOdd, numList) print print fold(plus, numList, 0) print reduce(plus, numList) print # lambda print map(lambda x: x*x, numList) print filter(lambda x: x%2==0, numList) print reduce(lambda x, y: x+y, numList) if __name__ == "__main__": main()
実行結果
D:\workspace\Python\3-1>python test.py [1, 4, 9, 16, 25] [1, 4, 9, 16, 25] [2, 4] [2, 4] 15 15 [1, 4, 9, 16, 25] [2, 4] 15
うん、うまく動いてくれている。
たぶん、「式と文」の違いについてまだよく分かっていないから
def isOdd(x): return x % 2 == 0
というのに違和感がある。
さらにコードの後半にはラムダ形式を取り入れてみた。
なんか不思議なコードになるなぁ。
ちょっとググって見ると、やっぱりラムダも関数型言語にかかわることらしい。
ちょっと勉強になった。