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

【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ずつ増えていきます。

■ 次回

次はクロージャーを取り上げてみたいと思います。