関数内関数
関数を
ほかの関数の中で定義することができる。
>>>def outer(a, b):
>>> def inner(c, d):
>>> return c + d
>>> return inner(a, b)
>>>print(outer(4, 7))
11
関数内関数は、ループやコードの重複を避けるために役に立つ
複数回実行される複雑な処理をほかの関数で実行するのである。次の
関数内関数は、引数にテキストを追加する
>>>def knights(saying):
>>> def inner(quote):
>>> return "We are the knights who say: '%s'" %quote
>>> return inner(saying)
>>>print(knights('Mi!'))
We are the knights who say: 'Mi!'
クロージャー
関数内関数は、クロージャとして機能する。クロジャーとは、他の関数
によって動的に生成される関数で、その関数の外で作られた変数の値を
覚えておいたり、変えたりすることができる。
次の例は先ほどの kと同じ knights() と同じものをつくる名前を
knights2()にして、inner()関数は、inner2()というクロージャー
にする、違いをまとめると
◎inner2()は、引数を要求せず、外側の関数に対するsaying引数を
直接使う
◎knights2()は、inner2()を呼び出すのではなく、その関数名を
を返す。
>>>def knights2(saying):
>>> def inner2():
>>> return "We are the knights who say: '%s'" %saying
>>> return inner2
inner2()関数は、knights2に渡されたsayingの値を知っており、覚えて
いる。return inner2という行は、このinner2関数のために専用のコピー
を返す(しかし、呼び出さない)。innner2は動的に作成された関数であ
り、どのように作成されたかを覚えている。これがすなわち
「クロジャー」である。
異なる引数を使って、knights2を2回よびだしてみよう。
>>>a = knights2('Duck')
>>>b = knights2('Hasenpfeffer')
>>>print(a())
>>>print(b())
We are the knights who say: 'Duck'
We are the knights who say: 'Hasenpfeffer'