9.1.5クロージャー(関数閉方)
クロージャーとは 上位のローカル変数を参照した入れ子の関数のこと

>>> def counter(init):
...    #カウント値
...    count = init
...    #カウント値をインクリメントする内部関数
...    def increment():
...       nonlocal count
...       count += 1
...       return count
...    return increment
...
>>> c1 = counter(1)
>>> c2 = counter(25)
>>> print(c1())
2
>>> print(c1())
3
>>> print(c2())
26
>>> print(c2())
27
  1. 1.最初に、counter 関数を定義します。この関数は初期値(init)を引数として受け取り、カウント値(count)を保持します。

  2. 2.次に、counter 関数の内部で increment 関数を定義します。この関数は、count を 1 だけ増加させ、その値を返します。

  3. 3.increment 関数で nonlocal ステートメントを使用します。これにより、count という名前の変数は、エンクロージングスコープ(ここでは counter 関数)のものであることが示されます。これにより、increment 関数から counter 関数の count 変数を変更できます。

  4. 4.counter 関数は、increment 関数自体を返します。したがって、counter 関数を呼び出すと、実際には increment 関数が返されます。この increment 関数は、counter 関数の count 変数を "覚えて" おり、これがクロージャと呼ばれるものです。

  5. 5.c1 と c2 は counter 関数を異なる初期値で呼び出して生成した2つのクロージャです。これらはそれぞれ独立した count 変数を持つため、互いに影響を与えることなくカウントを進めることができます。

  6. 6.最後に、それぞれのクロージャを呼び出して(print(c1()) および print(c2()))、カウント値を増加させて表示します。それぞれの呼び出しで、関連付けられた count 値がインクリメントされます。