社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

python クロージャ

忘れた頃にまたやってくるクロージャ

def charge(price):
    def calc(num):
        return price * num
    return calc

child = charge(1000)
adult = charge(1500)

price1 = child(2)
price2 = adult(2)
print(price1)
print(price2)

クロージャでは関数の中に関数を定義する。
上記の例では、charge() の中に、calc() が定義されている。
charge() が呼び出されると、その戻り値として、calc() が返却される。
calc() は関数なので、戻り値は関数オブジェクトになる。

calc() は price * num の結果を返す関数。
charge() が呼び出された時点で、price が引数で与えられている。
そのため、戻り値は price に値が入った calc() 関数になる。

例えば、charge(1000) なら、1000 * num を返却する calc() 関数が戻り値になる。
それが、child に代入されている。

charge(1500) なら、1500 * num を返却する calc() 関数が戻り値になる。
それが、adult に代入されている。

child(2) を呼び出すと、それは calc(2) (※ただし price は 1000) を呼び出すのと同じである。
1000 * num を返すので、2000 が返ることになる。

adult(2) を呼び出すと、それは calc(2) (※ただし price は 1500) を呼び出すのと同じである。
1500 * num を返すので、3000 が返ることになる。