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

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