高階関数

何やらいかつい名前のやつが出てきた。
インスパイヤ先⇒お気楽 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

というのに違和感がある。


さらにコードの後半にはラムダ形式を取り入れてみた。
なんか不思議なコードになるなぁ。

ちょっとググって見ると、やっぱりラムダも関数型言語にかかわることらしい。
ちょっと勉強になった。