Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom
Dekoratory
Bardziej złożone dekoratory
Cel
Ustaw pizze w piekarnikach w odpowiednich temperaturach i przygotuj sałatki przy użyciu dekoratorów z argumentami.
Teraz, gdy pizze są już przygotowane, czas je upiec w piekarnikach. Gdy to zostanie wykonane, powinniśmy przygotować sałatki, które będą podawane razem z pizzami. Możesz wykonać te zadania, korzystając z dekoratorów z argumentami; podobnie jak w funkcjach niestandardowych, możesz również przekazywać argumenty przez dekoratory.
Pizze muszą zostać umieszczone w piekarniku, ale najpierw musisz zebrać więcej firewood w lewym dolnym rogu mapy. Po zebraniu, weź kosz przy ladzie obok lewego piekarnika - ten kosz zawiera pizza, które mają być pieczone w piekarnikach.
W edytorze kodu znajduje się funkcja oraz jej dekorator. Funkcja ta służy do umieszczania i pieczenia pizza w piekarniku, natomiast dekorator sprawdza, czy piekarnik ma odpowiednią temperaturę, a jeśli nie, zamiast tego umieszczany jest 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))
Przejdź w stronę oznaczonej jasną krzyżykiem X i użyj funkcji read() stojąc naprzeciw piekarnika, aby sprawdzić temperaturę piekarnika. Następnie, wywołaj udekorowaną funkcję bake_pizza() i podaj odczytaną temperaturę jako argument, na przykład: bake_pizza(450).
Podczas gdy będziesz umieszczać pizze i drewno w piekarniku, zatrzymaj się przy złotym znaku X i skieruj się w stronę szafki, gdzie możesz zebrać składniki do przygotowania sałatek. Aktualnie składniki sałatki są przechowywane w zagnieżdżonej liście, która została przedstawiona w edytorze kodu, jednak ta lista jest nieuporządkowana i korzystniej będzie mieć składniki umieszczone w odpowiedniej liście, aby można było ich użyć do sałatek.
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
Stwórz listę o nazwie ingredients i użyj List Comprehension, aby "spłaszczyć" zagnieżdżoną listę. Jest to proces usuwania podlist ze zagnieżdżonej listy, tak aby wszystkie elementy znalazły się razem w jednej liście, a nie w wielu mniejszych listach. Po spłaszczeniu listy, użyj funkcji speak() z tą listą, aby zweryfikować składniki, których będziesz używać.
Gdy wszystkie niezbędne elementy zostaną umieszczone w piekarnikach, a lista ingredients zostanie uzupełniona, przejdź do ciemnych znaków X, aby stworzyć sałatki. W edytorze znajduje się funkcja oraz dekorator, które tym razem nie są połączone i muszą zostać zadeklarowane ręcznie, na przykład: salad = add_toppings(toss_salad("ranch","carrot")). Zestaw tych funkcji przyjmuje dwa (2) argumenty: dressing oraz vegetable.
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))
Każdy ciemny znak X znajduje się na kolorowym dywanie; każdy z nich wymaga przygotowania innej sałatki przy użyciu składników, które zebrałeś ze szafki. Na żółtym dywanie przygotuj sałatkę używając: cesar oraz cheese; na zielonym dywanie przygotuj sałatkę używając: oil oraz tomato; na niebieskim dywanie przygotuj sałatkę używając: ranch oraz carrot.
Gdy wszystkie trzy (3) sałatki zostaną przygotowane przy użyciu udekorowanej funkcji toss_salad(dressing, vegetable) w podanym formacie, poziom zostanie ukończony.