【python】pythonのクロージャ
pythonでは、クロージャと呼ばれる関数オブジェクトを実装することができます。
関数オブジェクトとは、クラスのインスタンスのように関数をオブジェクトとして扱ったものです。
引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。(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
が状態を持つ関数を提供し、同じ呼び出しに対して異なる値が返ってきています。