Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom
Dekoratory
Optymalizacja dekoratorów
Cel
Zbierz składniki i przygotuj różne rodzaje pizzy za pomocą dekoratorów.
Skoro piece zostały już ustawione, nadszedł czas, aby przygotować pizze, które później upieczemy. Teraz, gdy wiemy jak używać dekoratorów, możemy je nieco zoptymalizować. Używając symbolu @ w kodzie, a następnie nazwy dekoratora i umieszczając ten kod nad dekorowaną funkcją, możemy automatycznie dołączyć dekorator bez użycia zmiennej. Na przykład:
# 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()
Warto zauważyć, że ta technika upraszcza proces poprzez posiadanie funkcji wstępnie udekorowanej przed użyciem, jednak czasami nadal możesz chcieć przypisać dekorator do zmiennej, aby uzyskać większą elastyczność.
Na początek, udaj się do złotego znaku X i weź składniki do zrobienia pizzy. Składniki do zrobienia pizzy to: "cheese", "dough", "red sauce", "peperoni", "ham", "olive", "pepper", "onion" oraz "pineapple". Większość z tych składników znajduje się w macierzy reprezentującej półki spiżarni, użyj List Comprehensions, aby zapisać wszystkie przedmioty, które chcesz zebrać, do listy.
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]
W powyższym kodzie lista ingredients przechodzi przez wiersze macierzy o nazwie shelves i usuwa wszystkie elementy o wartości "jar". Ta List Comprehension oszczędza nam czas, dzięki czemu nie musimy wszystko dodawać ręcznie. Użyj funkcji speak() z listą składników, aby zweryfikować, które przedmioty zamierzasz użyć.
Gdy wszystkie składniki zostaną zebrane, z wyjątkiem "pineapple", funkcje do tworzenia pizzy muszą mieć dodane funkcje place(), aby dokończyć swoją funkcjonalność. Funkcje te są przygotowane w edytorze kodu i noszą nazwy: peperoni_pizza() która wymaga: "peperoni", vegetable_pizza() która wymaga: "olive", "pepper", "onion", oraz pineapple_pizza() która wymaga: "ham" i "pineapple".
Udaj się do ciemnych znaków X i użyj udekorowanych funkcji, aby przygotować pizze. Na znakach X z czerwonymi dywanami utwórz peperoni_pizza(), na zielonych dywanach utwórz vegetable_pizza(), a na żółtych dywanach utwórz pineapple_pizza(). W drodze do żółtego dywanu zatrzymaj się przy jasnym znaku X, stój twarzą do szafki i użyj funkcji collect(), aby pobrać "pineapple". Przygotuj wszystkie pizze, aby pomyślnie ukończyć poziom.