Coding for KidsCoding for Kids
创意关卡挑战教师指南
为功能投票
高级 Python 开发课程
第 章
>
第 级

装饰器
更复杂的装饰器

目标

使用带参数的装饰器,将比萨放入正确温度的烤箱中,并准备沙拉。

现在比萨已经准备好,现在是时候把它们放进烤箱烹饪了,一旦完成后,我们还需要为比萨搭配准备沙拉。你可以通过使用带参数的装饰器来完成这些任务,类似于自定义函数,你也可以通过装饰器传递参数。

首先,需要将比萨放入烤箱,但在此之前你需要在地图左下角收集更多的 "firewood"。收集完后,到左侧烤箱旁的柜台处获取篮子,该篮子里装有待烤的 "pizza"

代码编辑器中已经设置好了一个函数及其装饰器,该函数用于将 "pizza" 放置并烤制在烤箱中,而装饰器则会检查烤箱的温度是否合适;如果温度不够,则会放置 "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))

走向带有浅色 X 标记的区域,并在面对烤箱时使用 read() 函数来确定烤箱的温度。接着,编写带有装饰器的函数 bake_pizza(),并传入你读取到的温度作为参数,例如:bake_pizza(450)

当你把比萨和火柴放入烤箱时,请停在带有金色 X 标记的区域,并面向橱柜,在这里你可以收集制作沙拉所需的原料。目前,沙拉原料存储在代码编辑器中所示的嵌套列表中,但该列表相当混乱,最佳做法是将这些项目整理到一个规范的列表中,以便后续制作沙拉时使用。

cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]

创建一个名为 ingredients 的列表,并使用列表解析(List Comprehension)来“扁平化”嵌套列表。这个过程即是将嵌套列表中的子列表拆分,使所有项目集合到一个列表中,而不是保留多个较小的列表。列表扁平化后,使用 speak() 函数输出该列表,以便验证将要使用的原料。

在所有必要的物品都已放入烤箱,并且 ingredients 列表处理完毕后,走向带有暗色 X 标记的区域来制作沙拉。编辑器中已设置了一对函数和装饰器,这次它们并未连接,需要你手动声明,例如:salad = add_toppings(toss_salad("ranch","carrot"))。这组函数接收两个参数:dressingvegetable

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))

每个暗色 X 标记都位于彩色地毯上,每个地毯上都需要利用你从橱柜中收集的原料制作不同的沙拉。在黄色地毯上,用 "cesar""cheese" 制作沙拉;在绿色地毯上,用 "oil""tomato" 制作沙拉;在蓝色地毯上,用 "ranch""carrot" 制作沙拉。

当所有三款沙拉都按照上述格式,使用装饰函数 toss_salad(dressing, vegetable) 制作完成后,关卡将顺利通关。

代码书