上級Python開発コース
チャプター
>
レベル
高度な関数
クロージャ
目的
クロージャを設定して使用することにより、農場の水供給を調整する。
周囲の農地に灌漑するために設計された4つの水槽があります。正しい場所に適切な量の水が分配されるように、これらの水槽の切り替えが必要です。そのために、クロージャを使用すると作業が大幅に簡単になります。
クロージャはデータをカプセル化するために設計された入れ子関数であり、使用する変数の数を減らし、関数内にデータを隠蔽することで外部からの操作ができなくなります。つまり、関数を閉じ込めるということです。
水槽内の水を調整するために、乗数として動作する入れ子関数を作成します。この関数はループと同じように動作し、外側の関数である multiplier_of() は、内側の関数である multiplier() の引数と掛け合わされる引数を持っています。
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
設定が完了したら、クロージャを設定して関数を閉じ込めます。これにより、値へのアクセスが防がれ、その使用が固定されます。
# Set up Closure that multiplies any number by 2 multiply_by_2 = multiplier_of(2) # Uses closure to display a number on screen player.speak( multiply_by_2(4) ) # The number displayed is 8, the formula is [2 x 4 = 8]
上記のクロージャは multiply_by_2() と名付けられており、事前に設定された引数、すなわち 2 を使って作成した入れ子関数を利用しています。結果として、引数として追加される任意の数はすべて2倍にされ、この属性はクロージャによって閉じ込められているため変更できません。
次に、水槽の水を調整するために、3つのクロージャを設定します:multiply_by_2、multiply_by_3、および multiply_by_5 。例として以前に示されたフォーマットと同じ方法でそれぞれを手動で設定します。例:multiply_by_2 = multiplier_of(2) 。
このレベルには定数の辞書 tanks があり、インデックスとして6つの色("red"、"blue"、"orange"、"purple"、"yellow"、"green")が含まれています。各インデックスは、水槽の側面を流れる水量を表す数値を保持しており、この数値は前述の「multiply_by」クロージャを使用して水槽を調整するために利用されます。
これを容易にするために、エディタ内で regulate_water() という関数が設定されます。この関数は2つの引数を取ります。1つ目は上記のインデックスを表す色、2つ目は使用する乗数クロージャを表すものです。関数の使用例は次のとおりです:regulate_water("red", multiply_by_2) 。
暗い X マークの上にある色付きカーペットの方へ向かい、水槽に向かって進みます。regulate_water() 関数を使用し、カーペットの色を最初の引数として、適切な乗数クロージャを2番目の引数として設定してください。各色付きカーペットに使用する乗数は以下のとおりです:
multiply_by_2 - "red" と "green" multiply_by_3 - "blue" と "purple" multiply_by_5 - "orange" と "yellow"
各水槽の側面の水を調整して、レベルを完了させてください。