上級Python開発コース
チャプター
>
レベル
デコレーター
より複雑なデコレーター
目的
引数付きデコレーターを使用して、ピザを適切な温度でオーブンに入れ、サラダを準備します。
ピザの準備が整ったので、次はオーブンで焼く段階です。焼き上がった後、ピザに合わせたサラダも準備する必要があります。これらのタスクは、引数付きのデコレーターを使用することで実現できます。カスタム関数と同様に、デコレーターにも引数を渡すことが可能です。
ピザをオーブンに入れる必要がありますが、まずはマップの左下で firewood を集める必要があります。集めたら、左側のオーブンの近くにあるカウンターのバスケットを取り、そのバスケットにはオーブンで焼くための pizza が入っています。
コードエディタには関数とそのデコレーターが設定されています。この関数はオーブンに pizza を配置し焼くために使用され、デコレーターはオーブンの温度が適切かどうかを確認します。もし適切な温度でなければ、代わりに firewood が配置されます。
def place_oven(func):
def check(temp):
if temp < 450:
player.speak("Oven is not hot enough")
player.open()
player.place("firewood")
player.close()
return
return func(temp)
return check
@place_oven
def bake_pizza(temp):
player.open()
player.place("pizza")
player.close()
player.speak("I am baking Pizza at %d degrees" % (temp))
明るいXマークの場所に向かい、オーブンに向かって read() 関数を使用して温度を確認してください。その後、読み取った温度を引数として渡し、デコレーター付き関数 bake_pizza() を実行します。例えば: bake_pizza(450) 。
ピザや薪をオーブンに配置する途中、金色のXマークで立ち止まり、キャビネットに向かってください。ここではサラダを作るための材料を集めることができます。現在、サラダの材料はコードエディタに記述された二重リストに格納されていますが、このリストは乱雑なので、サラダに使用するために材料を適切なリストに整理することが望ましいです。
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
ingredients という名前のリストを作成し、リスト内包表記を使用して二重リストを「フラット」にしてください。これは、二重リストからサブリストを除去し、すべての項目を一つのリストにまとめるプロセスです。リストがフラットになったら、speak() 関数を使用して、使用する材料を確認してください。
必要なアイテムがすべてオーブンに配置され、ingredients リストの整理が完了したら、暗いXマークの場所に向かいサラダを作成してください。エディタには関数とデコレーターが設定されていますが、今回は連動しておらず、手動で宣言する必要があります。例えば: salad = add_toppings(toss_salad("ranch","carrot")) 。この一連の関数は、dressing と vegetable の2つの引数を取ります。
def add_toppings(func):
def add(dressing, vegetable):
player.place(dressing)
player.place(vegetable)
func(dressing, vegetable)
return add
@add_toppings
def toss_salad(dressing, vegetable):
player.combine("lettuce", dressing, vegetable)
player.speak("I am preparing salad with %s dressing and %s"
% (dressing, vegetable))
各暗いXマークは色付きのカーペット上に位置しており、それぞれにキャビネットから集めた材料で作る異なるサラダがあります。黄色いカーペット上では cesar と cheese を使ったサラダ、緑のカーペット上では oil と tomato を使ったサラダ、青のカーペット上では ranch と carrot を使ったサラダを作成してください。
上記の形式でデコレーター付き関数 toss_salad(dressing, vegetable) を使用して3種類のサラダがすべて完成すると、レベルクリアとなります。