Pythonのソースコードで、以下のような記述を見かけたことはないでしょうか。
def hoge():
def huga():
print("piyo")
return huga
この、関数の中の関数(huga
関数)は「関数内関数」が正式な用語です。
def hoge():
def huga():
print("piyo")
return huga
print(hoge()) # => <function hoge.<locals>.huga at ...>
hoge()() # => piyo
hoge
関数を呼ぶと、huga
関数が返ってきます。
そのため、カッコを2回重ねると、piyo関数を呼ぶことができます。
Pythonの関数は第一級オブジェクトのため、変数のように扱うことができるのです。
def foo():
print("foo")
bar = foo # barにfooを代入(barは関数になる)
bar() # => foo
関数内関数は、外の関数で定義された変数を使用することができます。
def hoge(arg1):
sep = ","
def huga(arg2):
print(arg1, arg2, sep=sep)
return huga
hoge("hoge")("huga") # => hoge,huga
この例だと、arg1
とsep
はhuga
関数の外で宣言された変数ですが、
huga
関数の中で使用されています。
これはPythonがクロージャを使用しているからです。
クロージャの概念的な説明は難しいので、参考を見ていただくとわかりやすいと思います。