Pythonの勉強中にクロージャなるものが出てきて何言っているのかわからなかったので、忘れたときに振り返ることができるようメモ。
基本的には以下を参照するとなんとなくわかる。
Python Tips:Pythonでクロージャを使いたい
クロージャってどんなときに使うの? ~ 利用場面を 3つ 挙げてみる
[Python] 関数(4)
クロージャをざっくりいうと
関数内の変数の値は、関数の宣言(関数を読み込んだ)時点で通った変数の値になる。
みたいなのが、今の俺の理解。
こんなのあったときに、関数が読み込んだ時点で変数「i」には5が格納されているので、そのあとに変数「i」に6が入っても返却される値は5になる。
i = 5
def f(arg=i):
print(arg)
i = 6
f()
今までクロージャと無縁の世界に生きてきたので、なんでや!6やろ!感ある。
でもって、クロージャってどんなときに使うの? ~ 利用場面を 3つ 挙げてみるに記載されているコレ。
def circle_area_func(pi):
"""円の面積を求める関数を返す"""
def circle_area(radius):
return pi * radius ** 2 #このpiは、circle_area_func()の引数に指定された値
return circle_area #関数を返り値として返す
#円周率を 3.14 に設定した場合の面積を計算する関数を生成
ca1 = circle_area_func(3.14)
#次に、円周率を3.141592に設定した場合の関数を生成
ca2 = circle_area_func(3.141592)
#上記で作成した2つの関数に、半径=1 を引数に与えて、演算結果を取得
ca1(1)
ca2(1)
#上記で作成した2つの関数に、半径=2 を引数に与えて、演算結果を取得
ca1(2)
ca2(2)
各関数のパラメータにはそれぞれの値が入るんだけど、radiusに格納される値がなぜこれなのかよくわからなかった。
- circle_area_func(pi)のパラメータ「pi」には3.14(or 3.141592)
- circle_area(radius)のパラメータ「radius」には1(or 2)
そもそも俺は「ca1 = circle_area_func(3.14)」のca1に何が格納されているのかというのを理解できていなかったよう。
ca1に格納されているのって、ずっと関数「circle_area_func(pi)」内のすべてだと思っていたんだけど、じゃなくて関数「circle_area(radius)」だったのな。
def circle_area(radius):
return pi * radius ** 2 #このpiは、circle_area_func()の引数に指定された値
return circle_area
後続処理で「ca1(1)」が実行されたときに、呼ばれているのは関数「circle_area(radius)」。
だからパラメータ「radius」には「ca1(1)」の1が格納されているということ。
関数「circle_area(radius)」内の変数「pi」はクロージャの考え方で、「ca1 = circle_area_func(3.14)」で引数に入れた3.14が入っているというだけ。
ものすごい時間とられたけど、腹落ちしたのでよし。