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 が返ることになる。