Khóa học Phát triển Python Nâng cao
Chương
>
Cấp độ
Trình trang trí
Tối ưu hóa Decorators
Mục tiêu
Thu thập nguyên liệu và chuẩn bị các loại pizza khác nhau bằng cách sử dụng decorators.
Bây giờ khi lò nướng đã được thiết lập, đã đến lúc chuẩn bị một số chiếc pizza để chúng ta có thể nướng sau này. Khi đã biết cách sử dụng decorators, ta có thể tối ưu hóa chúng một chút. Bằng cách sử dụng ký hiệu @ trong mã tiếp theo là tên của decorator và đặt đoạn mã này ở phía trên hàm được trang trí, ta có thể tự động gắn một decorator mà không cần sử dụng biến. Ví dụ:
# 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()
Lưu ý rằng, kỹ thuật này giúp đơn giản hóa quá trình bằng cách có một hàm được trang trí trước khi sử dụng, tuy nhiên đôi khi bạn có thể vẫn muốn gán một decorator cho một biến để có sự linh hoạt hơn.
Để bắt đầu, hãy đi đến dấu X màu vàng và lấy các nguyên liệu để làm pizza. Các nguyên liệu để làm pizza bao gồm: "cheese", "dough", "red sauce", "peperoni", "ham", "olive", "pepper", "onion" và "pineapple". Phần lớn các nguyên liệu này nằm trong một ma trận đại diện cho kệ tủ thực phẩm, sử dụng List Comprehensions để lưu trữ tất cả các mục mà bạn muốn lấy trong một danh sách.
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]
Trong đoạn mã trên, danh sách ingredients lặp qua các hàng của ma trận có tên shelves và loại bỏ tất cả các mục là "jar". List Comprehension này giúp ta tiết kiệm thời gian khi không phải thêm mọi thứ thủ công lại với nhau. Sử dụng hàm speak() với danh sách nguyên liệu để xác nhận các mục mà bạn sẽ sử dụng.
Sau khi đã thu thập tất cả nguyên liệu trừ "pineapple", các hàm để làm pizza cần được thêm hàm place() nhằm hoàn thiện chức năng của chúng. Các hàm này đã được thiết lập sẵn trong trình chỉnh sửa mã và được đặt tên: peperoni_pizza() yêu cầu: "peperoni", vegetable_pizza() yêu cầu: "olive", "pepper", "onion" và pineapple_pizza() yêu cầu: "ham" và "pineapple".
Hãy đi đến các dấu X màu đen và sử dụng các hàm đã được trang trí để chuẩn bị các chiếc pizza. Ở các dấu X có thảm đỏ, tạo peperoni_pizza(), ở thảm xanh tạo vegetable_pizza() và ở thảm vàng tạo pineapple_pizza(). Trên đường đến thảm vàng, hãy dừng lại ở dấu X sáng, đối diện với tủ và sử dụng hàm collect() để lấy "pineapple". Chuẩn bị tất cả các chiếc pizza để hoàn thành level thành công.