고급 파이썬 개발 과정
챕터
>
레벨
데코레이터
데코레이터 최적화
목표
데코레이터를 사용하여 재료를 수집하고 다양한 종류의 피자를 준비합니다.
이제 오븐이 준비되었으므로 나중에 요리할 피자를 미리 준비할 시간입니다. 데코레이터 사용법을 알게 되었으니 이를 조금 최적화해봅시다. 코드에서 @ 기호 뒤에 데코레이터 이름을 붙이고 이 코드를 데코레이트된 함수 위에 배치하면, 변수를 사용하지 않고도 자동으로 데코레이터를 적용할 수 있습니다. 예를 들어:
# 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". 이 재료 대부분은 식료품 선반을 나타내는 행렬(Matrix) 안에 있으며, 리스트 컴프리헨션을 사용하여 집어들고자 하는 모든 항목들을 리스트에 저장하세요.
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"을 집어드세요. 레벨을 성공적으로 완료하기 위해 모든 피자를 준비하세요.