Works by ...

プログラミング関連でメモする

【python】pythonのクロージャ

pythonでは、クロージャと呼ばれる関数オブジェクトを実装することができます。

関数オブジェクトとは、クラスのインスタンスのように関数をオブジェクトとして扱ったものです。

クロージャの定義は、Wikipedia氏曰く

引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。(Wikipediaより引用)

だそうです。

実装例を下に示します。

def counter():
    c = 0
    def count():
        nonlocal c
        c = c + 1
        return c
    return count

f = counter()
print(f()) # 1
print(f()) # 2
print(f()) # 3

よくあるクロージャの実装では、関数の中にさらに関数を定義し、 外側の関数に変数などを持たせ、内側の関数にその更新を行わせます。 外側の関数は内側関数のオブジェクトを返戻することで、「変数等の状態を保持する関数」としての機能を提供します。

例えば上のコードでは、

counter()は変数cを定義し、count()cの更新+cの返戻を行っています。

②関数counter()count()関数を内側で定義し、かつ関数オブジェクトとして返戻しています。

counter()から返戻されるcount()関数オブジェクトが変数fに代入され、呼び出し毎に返戻値が変化しています。

counter

結果としてfが状態を持つ関数を提供し、同じ呼び出しに対して異なる値が返ってきています。