Python のお勉強5 ( 関数その2 )

Python のお勉強シリーズ」第5回目は、4回目に続き、関数についてサンプルコード書いてみました。

Python では関数それ自体がオブジェクトというところで、

* 関数の引数に関数を指定する
* 関数の return を関数にする
* シーケンスに追加する

とかとかもできるとのことです。そういうのを試したサンプルコードになります。

■ function2.py

#coding: cp932

import types

def hoge():
    print("hoge()")

def uga():
    print("uga()")

def test1(arg):
    arg()

def test2(*arg):
    print("print arg:", arg)
    for i in arg:
        if isinstance(i, types.FunctionType): #引数が関数であるかのチェック (*)
            i()
        else:
            print(i, "is not function !!")

def test3():
    return hoge

if __name__ == "__main__":
    print("----- test1 -----")
    test1(hoge) #関数の引数に関数を指定

    print("----- test2 -----")
    test2(hoge, uga) #関数の引数シーケンスに関数を指定
    test2(hoge, "oro") #関数ではない引数を指定

    print("----- test3 -----")
    r = test3()
    r() #return された関数を実行

■ 実行結果

----- test1 -----
hoge()
----- test2 -----
print arg: (<function hoge at 0x005B44F8>, <function uga at 0x005B46A8>)
hoge()
uga()
print arg: (<function hoge at 0x005B44F8>, 'oro')
hoge()
oro is not function !!
----- test3 -----
hoge()


サンプルコードだと test2() の中でやってますが、「オブジェクトが関数かどうか?」isinstance(i, types.FunctionType) でチェック可能みたいです ( 本当は test1() でも、test3() の return についてもチェック必要ですね・・・ )。

・2. 組み込み関数 — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/functions.html#isinstance

・Function オブジェクト — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/c-api/function.html


以上になります。

[ 環境情報 ]
Windows 7 SP1
Python 3.4.3