【Python】クロージャーって何だろう?

■ 概要
クロージャーとは、関数の中で定義された関数が、外側の関数の変数を「記憶」して使う仕組みで、デコレータやコールバック関数の基礎として重要です。
■ 具体例1
def make_multiplier(factor):
def multiplier(x):
return x * factor
return multiplier
times3 = make_multiplier(3)
times5 = make_multiplier(5)
print(times3(10)) # 30
print(times5(10)) # 50
■ 解説
- make_multiplier関数の中で、multiplier関数を定義し、それをreturnで返しています。
- multiplier関数は、factorという外側の変数を使っています。
- factorはmake_multiplier関数の実行時に値が決定し、その値を覚えたままmultiplier関数が実行されています。つまり、times3は、
make_multiplier(3)
が実行されることで、x * 3
という関数が格納されています。
■ クロージャーの特徴
- 関数がネストされています。
- 内側の関数が、外側の関数の変数を使っています。
- 外側の関数の実行が終わっても、内側の関数がその変数を覚えています。
■ 用途
- 状態を保持した関数を作りたいとき
- 関数に引数を固定した形で渡したいとき
- デコレータを作るとき
具体例2
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
c = counter()
print(c()) # 1
print(c()) # 2
print(c()) # 3
■ 解説
- nonlocal宣言を使うことで、内側の関数から外側の関数の変数を更新できます。
- 外側の関数(counter)の実行が終わっても、内側の関数(increment)がその変数(count)を覚えています。したがって、
c()
と実行するたびに、countの値が1ずつ増えていき、戻り値も1ずつ増えていきます。
■ 次回
次はクロージャーを取り上げてみたいと思います。