高级 Python 开发课程
第 章
>
第 级
异常处理
否则子句
目标
取出修理材料并将其分类,然后使用 else 子句结合异常处理丢弃不需要的废料。
一些修复材料存放在建筑物顶部,用于在风暴或日常磨损后修理屋顶。有些材料最近刚送达,仍然包装在外包装和容器中;其他一些则存放了很长时间,并与杂物混在一起。最好对这些材料进行分类,将它们妥善存储,并丢弃垃圾和废料。
由于材料混乱的性质,你可能会遇到错误。你可以使用 try / except 代码块来解决这个问题,但如果你不熟悉可能遇到的错误,可能会有点棘手。不过,你可以通过添加 else 分支来扩展你的异常处理工具。这允许你在 except 块未执行时运行代码,有助于简化代码,非常适用于识别和清理错误。
首先,你应该走进左侧储藏室,朝着标有浅色 X 的方向前进。这个房间存放用于修理屋顶瓦片的瓦片材料。使用 collect() 函数拾取名为 shingles 的列表常量。
该列表中很可能混杂着一些必须清除的垃圾材料,此外这些材料存储在六(6)个不同的隔间中,每个隔间内都有一定数量的材料。你需要将所有材料整合到一堆中。创建一个变量 red_storage 用于存储所有材料,同时创建一个列表 junk 用于放置所有废料。
通常情况下,你只需要识别这些材料,通过 int() 将它们转换为整数,并将其存储在变量中以便于放置。但正如你所预料的,鉴于本章前面的关卡和本练习的主题,错误是难免的。
for x in range(6): player.speak(int(shingles[x])) red_storage+=int(shingles[x])
这将不幸地产生一个 Value Error,因为列表中的某些项似乎不是数字。为了解决这个问题,你可以使用 try / except 和 else 代码块对材料进行排序。通过使用 else 块,我们实际上将 except 块转换为一个过滤器,用于清除列表中不需要的元素,同时 else 块捕捉并将列表中的有效元素转移到我们创建的变量中。
for x in range(6): try: player.speak(int(shingles[x])) except: player.speak("Item %s is junk" % (x)) junk.append(shingles[x]) else: red_storage+=int(shingles[x])
这样,red_storage 变量现在包含了所有可用的瓦片,而所有垃圾则被添加到了 junk 列表中。走到你所在的左侧储藏室内标有金色 X 的位置,使用 write() 函数记录下待存储瓦片的数量,如下所示: await player.write("There are %s shingles ready for use in storage" % (red_storage))。然后,走到红色地毯上标有深色 X 的位置,使用 place() 函数将 red_storage 变量存储到箱子中。
完成此任务后,前往右侧储藏室,该房间存放木板以及修复屋顶和墙体所需的材料。前往绿色地毯上标有深色 X 的位置,并使用 collect() 函数从箱子中获取一个名为 planks_set 的列表常量,这个列表包含了已经清理干净废料的木板。走到旁边标有浅色 X 的位置,再次使用 collect() 函数获取另一个名为 shipment 的列表常量,这些木板材料是最近运输过来的,仍然包含一些废料。
就像在前一个房间一样,shipment 列表中很可能混有几项需要去除的废料。同样,它们也存储在六(6)个不同的隔间中,每个隔间中都有一定数量的材料。创建一个名为 blue_storage 的变量用于存储所有材料,以便将它们整合成一堆。和之前一样,废料将被放入 junk 列表中。
对于木板,我们将转换 shipment 列表中所有有用的材料并将其添加到 planks_set 列表中,然后使用 int() 将它们全部汇总到 blue_storage 变量中。然而,正如之前一样,错误在所难免。
for y in range(6): planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) blue_storage+=int(planks_set[y])
这一次,你可以预期会出现一个 Type Error,这是当你尝试将数字与字符串相加时发生的错误。可以通过再次使用 try / except 和 else 代码块来解决这个问题,其中 try 尝试将列表相加,except 块用于过滤列表中的废料,而 else 分支则将木板添加到 blue_storage 中。
for y in range(6): try: planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) except: player.speak( "Item %s is junk. Slot only has %s items" % (y,planks_set[y])) junk.append(shipment[y]) else: blue_storage+=int(planks_set[y])
现在 blue_storage 变量已被填充,你可以记录并存储所有木板。走到你所在的右侧储藏室中标有金色 X 的位置,面对桌子,使用 write() 函数统计你整合的材料,如下所示: await player.write("There are %s planks ready for use in storage" % (blue_storage))
为了完成这一关,走到蓝色地毯上标有深色 X 的位置,使用 place() 函数将 blue_storage 变量存储到箱子中。然后,走到中间大厅紫色地毯上标有深色 X 的位置,使用 place() 函数将 junk 列表投入垃圾槽,从而完成任务。