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
以上になります。