LoginSignup
1
2

More than 5 years have passed since last update.

クロージャ調査内容の備忘録

Last updated at Posted at 2017-05-12

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が入っているというだけ。

ものすごい時間とられたけど、腹落ちしたのでよし。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2