Khóa học Phát triển Python Nâng cao
Chương
>
Cấp độ
Các trình trang trí
Decorators phức tạp hơn
Mục tiêu
Đặt Pizza vào lò với nhiệt độ đúng và chuẩn bị xà lách bằng cách sử dụng decorators có đối số.
Bây giờ các món Pizza đã được chuẩn bị, đã đến lúc nướng chúng trong lò. Sau khi hoàn thành việc đó, chúng ta nên chuẩn bị xà lách để ăn kèm với pizza sau khi chúng xong. Bạn có thể hoàn thành các nhiệm vụ này bằng cách sử dụng decorators có đối số, tương tự như các hàm tùy chỉnh, bạn cũng có thể truyền đối số qua decorators của mình.
Các món pizza cần được đặt vào lò nhưng trước tiên bạn cần thu thập thêm "firewood" ở góc dưới bên trái của bản đồ. Sau khi thu thập xong, hãy lấy giỏ ở quầy bên lò bên trái, giỏ này chứa "pizza" cần được nướng trong lò.
Có một hàm và decorator của nó đã được thiết lập trong trình soạn thảo mã. Hàm này được sử dụng để đặt và nướng "pizza" trong lò, decorator sẽ kiểm tra xem lò có đạt nhiệt độ đúng không và nếu không, "firewood" sẽ được đặt thay thế.
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))
Đi đến dấu X sáng và sử dụng hàm read() khi đối diện với lò, để xác định nhiệt độ của lò. Tiếp theo, viết hàm đã được trang trí bake_pizza() và thêm nhiệt độ bạn đo được làm đối số, ví dụ: bake_pizza(450).
Trong khi bạn đặt các món pizza và firewood vào lò, hãy dừng lại ở dấu X vàng và đối diện với tủ, nơi bạn có thể thu thập các nguyên liệu để làm xà lách. Hiện tại, các nguyên liệu cho xà lách được lưu trữ trong một danh sách lồng nhau được nêu trong trình soạn thảo mã; tuy nhiên, danh sách này rối và bạn sẽ có lợi nếu các mục được lưu trữ trong một danh sách đúng để sử dụng cho món xà lách của bạn.
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
Tạo một danh sách có tên ingredients và sử dụng List Comprehension để “làm phẳng” danh sách lồng nhau. Đây là quá trình loại bỏ các danh sách con khỏi danh sách lồng nhau để tất cả các mục bây giờ được đưa vào một danh sách duy nhất thay vì nhiều danh sách nhỏ. Sau khi danh sách đã được làm phẳng, sử dụng hàm speak() với danh sách đó để xác nhận các nguyên liệu bạn sẽ sử dụng.
Sau khi tất cả các mục cần thiết đã được đặt vào lò, và danh sách ingredients đã được xử lý, hãy đi đến các dấu X tối để tạo xà lách. Trong trình soạn thảo, một hàm và decorator đã được thiết lập; nhưng lần này chúng không được kết nối và phải được khai báo thủ công, ví dụ: salad = add_toppings(toss_salad("ranch","carrot")). Bộ hàm này nhận hai (2) đối số: dressing và 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))
Mỗi dấu X tối được đặt trên một tấm thảm có màu khác nhau, mỗi tấm có một món xà lách khác nhau cần được tạo ra bằng cách sử dụng các nguyên liệu bạn đã lấy từ tủ. Trên tấm thảm màu vàng, tạo một món xà lách sử dụng: "cesar" và "cheese"; trên tấm thảm màu xanh lá, tạo một món xà lách sử dụng: "oil" và "tomato"; trên tấm thảm màu xanh dương, tạo một món xà lách sử dụng: "ranch" và "carrot".
Khi tất cả ba (3) món xà lách đã được chế biến bằng cách sử dụng hàm đã được trang trí toss_salad(dressing, vegetable) theo định dạng này, cấp độ sẽ hoàn thành.