関数の中に関数

関数の中に関数

Pythonのソースコードで、以下のような記述を見かけたことはないでしょうか。

def hoge():
    def huga():
        print("piyo")
    return huga

この、関数の中の関数(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

この例だと、arg1sephuga関数の外で宣言された変数ですが、
huga関数の中で使用されています。

これはPythonがクロージャを使用しているからです。
クロージャの概念的な説明は難しいので、参考を見ていただくとわかりやすいと思います。

参考

Python Tips: Python でクロージャを使いたい