これまでPythonでの関数について学んできました。
Pythonはオブジェクト指向言語というプログラミング言語ですが、あらゆるものをオブジェクトとして扱います。
この関数をオブジェクト単体として扱うことができるのもPythonの特徴です。
また関数の中で関数を定義することもできます。これを関数内関数と言います。
ここではオブジェクトとしての関数の扱い方と関数内関数について見ていこうと思います。
オブジェクトとしての関数
Pythonではすべてものがオブジェクトとして扱うことができます。オブジェクトには文字列、数値、リスト、タプル、辞書などが含まれますが、関数もオブジェクトになります。
変数に関数を代入したり、関数の引数として関数を扱ったり、関数の戻り値として関数を返したりすることができます。
これによってPythonは他の言語では難しいことが行えると言われています。
具体的に見ていきましょう。
簡単な関数を使って見ていきましょう。
def hello():
print("Hello!")
これは関数を呼び出すと「Hello!」と表示されます。
実行してみるとこうなります。
この関数をオブジェクトとして扱うということになるわけですが、ここで別の関数を定義します。
run_in_funcという名前の関数を定義します。引数にはfuncという名前を与えます。このfuncは関数を示し、run_in_func関数を実行するとfuncが呼び出されると言う形をとります。
関数をオブジェクトとして引数として与えて、その関数を実行する関数ということですね。
このfuncの位置に、先ほどのhello()をオブジェクトして扱おうというコードになります。
具体的に書いて行きましょう。
def hello():
print("Hello!")
def run_in_func(func):
func()
print("Python!")
run_in_func(hello)
最初の関数はすでに作った関数です。この関数を次の関数の引数として実行します。run_in_func(hello)で関数を呼び出しています。このhelloがfuncに使った引数です。オブジェクトとして扱う時は、関数の丸括弧()をつけずに渡します。
このコードを実行してみましょう。Atomで実行してみます。ファイル名はfunction_as_object.pyとしています。
オブジェクトとして扱った関数が実行されているのがわかりますね。
このオブジェクトとしての関数は、引数を持たせることもできますし、*args、**kwargsを組み合わせて使うことももちろんできます。
関数内関数
先ほどは引数に関数を与えましたが、今度は関数内関数について見ていきましょう。
関数は他の関数を関数の中で定義することができます。
具体的に見ていきましょう。関数内関数ということで外側の関数とその中で定義される内側の関数を用意します。外側の関数名をouter_function、内側の関数名をinner_functionとします。
def outer_function(a, b):
def inner_function(c, d):
return (c + d) * 10
outfunc = a + b
infunc = inner_function(a, b)
print("a =", a, ",", "b =", b, ",", " outer =", outfunc, ",", "inner =" ,infunc)
内側の関数では二つの引数を加えて10倍する処理をしています。外側の関数では、二つの引数を足したものと、内側の関数にその引数を与えて値を取得しているものを変数に代入して、それをprintで出力しています。
これを実際に数値を入れて関数を呼び出してみるとこうなります。ファイル名前はin_func.pyとしています。
外側の関数を引数に3と4を入れて呼び出しています。この引数が内側の関数で処理されて値が返され、printで出力されているのがわかります。比較のために、引数の値とそれを加えた値を一緒に出力しています。
まとめ
Pythonでは、関数はそれ自体をオブジェクトとして扱うことができます。関数の引数として他の関数を使ったりすることができます。
関数をオブジェクトとして利用する時は、丸括弧を付けずに関数名だけで利用します。
関数はその関数内に別の関数を定義することができます。これを関数内関数と呼びます。
少し内容が難しくなってきたとところがあると思いますが、じっくり消化して行きましょう。