上級Python開発コース
チャプター
>
レベル
デコレーター
デコレーターの最適化
目的
デコレーターを使って具材を集め、さまざまな種類のピザを作ります。
オーブンの設置が完了したので、後で調理できるようにピザを用意する時間です。デコレーターの使い方がわかったので、それらを少し最適化する方法について学びます。コード内で @ 記号に続けてデコレーターの名前を書き、そのコードをデコレートされる関数の上に置くことで、変数を使用せずに自動的にデコレーターを適用することができます。例えば:
# Decorator
def create_pizza(func):
def set():
pizza = ["dough","red sauce","cheese"]
player.combine(pizza)
func()
return set
# Function being decorated with @
@create_pizza
def peperoni_pizza():
player.place("Peperoni")
player.speak("Peperoni Pizza has been prepped")
# Using pre-decorated function
peperoni_pizza()
この手法は、使用前に関数があらかじめデコレーションされるためプロセスが簡素化される一方で、柔軟性を高めるためにデコレーターを変数に割り当てたい場合もあることに留意してください。
まず、金色の X マークに向かって歩き、ピザを作るための具材を集めましょう。ピザ作りの具材は、"cheese"、"dough"、"red sauce"、"peperoni"、"ham"、"olive"、"pepper"、"onion"、および "pineapple" です。これらの具材の多くは、食料庫の棚を表すマトリックスの中に配置されています。リスト内包表記を使用して、取り出したいアイテムすべてをリストに格納してください。
shelves = [ ["cheese", "dough", "jar"], ["jar", "red sauce", "jar"], ["peperoni", "jar" , "ham"], ["olive", "pepper", "onions"] ] ingredients = [ item for row in shelves for item in row if not "jar" in item]
上記のコードでは、リスト ingredients が shelves という名前のマトリックスの各行を巡回し、"jar" を含むアイテムをすべて除外しています。このリスト内包表記により、すべてを手動で追加する手間を省くことができます。使用する具材を確認するために、speak() 関数を使ってください。
すべての具材が集まったら、"pineapple" を除いて、ピザを作る各関数にはその機能を完成させるために place() 関数が追加される必要があります。これらの関数はコードエディターに設定されており、名前は、peperoni_pizza() (必要な具材: "peperoni")、vegetable_pizza() (必要な具材: "olive", "pepper", "onion")、および pineapple_pizza() (必要な具材: "ham" と "pineapple")です。
暗い X マークの場所へ移動し、デコレーター付きの関数を使ってピザを用意してください。赤いカーペットの X マークでは peperoni_pizza() を、緑のカーペットでは vegetable_pizza() を、黄色のカーペットでは pineapple_pizza() を作成します。黄色いカーペットに向かう途中、明るい X マークに立ち寄り、キャビネットの方を向いて collect() 関数を使い "pineapple" を取ってください。すべてのピザを準備し、このレベルを無事にクリアしましょう。