Fejlett Python fejlesztési tanfolyam
Fejezet
>
Szint
Kivételkezelés
Máskülönben ág
Cél
Vedd át a javítóanyagokat, rendezd őket, majd az else ág segítségével, kivételkezeléssel dobd ki a nem kívánt hulladékot.
Néhány javítóanyagot az épület tetején tároltak, hogy viharok vagy általános kopás esetén a tető javítására szolgáljanak. Néhányat nemrég szállítottak be, és még mindig csomagokban, tartályokban vannak, míg másokat nagyon régóta tárolnak, és a szeméttel keverve hagyták. Jó ötlet lenne az anyagokat rendszerezni, megfelelően tárolni azokat, és eltávolítani a szemét és hulladék részeket.
A rendezetlen anyagok természetéből adódóan valószínűleg hibákra számíthatsz. Ezt kezelheted a try / except kódrészlettel, azonban kissé trükkös lehet, ha nem ismered, milyen hibákkal találkozhatsz. Ezen felül kibővítheted a kivételkezelési eszközeidet az else ág hozzáadásával. Ez lehetővé teszi, hogy kódot futtass, ha az except ág nem aktiválódik, így egyszerűsítve a kódot, és jól használható a hibák azonosítására és javítására.
Kezdetnek menj be a bal oldali raktárba, és kövesd a világos X jelet. Ez a szoba a tetőcserép javítására használt burkolatot tárolja. Használd a collect() függvényt, hogy felvedd a shingles nevű lista állandót.
A lista valószínűleg több szemét anyagot is tartalmaz, amelyeket el kell távolítani, ráadásul ezeket hat (6) külön rekeszbe rendezték, mindegyik saját anyagmennyiséggel. Össze kell gyűjtened az anyagokat egyetlen halomba. Hozz létre egy red_storage nevű változót az anyagok tárolására, és egy junk nevű listát, hogy ide tudd helyezni a hulladékot.
Normális esetben csak az anyagokat kellene azonosítani, egész számmá alakítani az int() segítségével, majd elmenteni egy változóba, hogy azután el tudd tárolni őket. De ahogy azt a fejezet korábbi szintjeiből, illetve a feladat témájából is sejtheted, hiba majd bekövetkezik.
for x in range(6): player.speak(int(shingles[x])) red_storage+=int(shingles[x])
Ez sajnos Value Error-t fog eredményezni, mivel a lista néhány eleme nem számként jelenik meg. Ennek orvoslására használhatod a try / except és else kódrészleteket, amelyekkel szétválogathatod az anyagokat. Az else ág segítségével hatékonyan átalakítjuk az except ágat egy szűrővé, amely megszabadít a lista nem kívánt elemeitől, míg az else ág elfogja és áthelyezi a lista jó elemeit az általunk létrehozott változóba.
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])
Ezzel a red_storage változóban most már minden használható burkolat szerepel, míg a hulladék minden darabja a junk listába került. Menj a bal oldali raktárban lévő arany X jel felé, és használd a write() függvényt, hogy lejegyezd a tárolásra kész cserepek számát, például így: await player.write("There are %s shingles ready for use in storage" % (red_storage)) Ezután menj a vörös szőnyegen lévő sötét X jel felé, és használd a place() függvényt, hogy a red_storage változót a dobozba tudd helyezni.
Miután ez a feladat elkészült, menj a jobb oldali raktárba. Ez a szoba a fa deszkákat és azokat az anyagokat tartalmazza, amelyek a tető és fal szerkezetek javításához szükségesek. Menj a zöld szőnyegen lévő sötét X jel felé, és használd a collect() függvényt, hogy a dobozból felvedd a planks_set nevű lista állandót, amely olyan deszkákat tartalmaz, amelyekből már tisztították a hulladékot. Menj a mellette lévő világos X jelhez, és használd ismét a collect() függvényt, hogy egy másik lista állandót, a shipment nevűt hozd ki, melyek olyan deszka anyagok, amelyeket nemrég szállítottak be, és amelyek még tartalmaznak némi hulladékot.
Ahogy az előző szobában, a shipment lista valószínűleg több szemét anyagot is tartalmaz, amelyeket el kell távolítani. Ahogy korábban, ezeket hat (6) külön rekeszbe rendezték, mindegyik saját anyagmennyiséggel. Hozz létre egy blue_storage nevű változót, hogy az összes anyagot egyetlen halomba tudjad egyesíteni. Mint korábban, a hulladék anyagok a junk listába kerülnek.
A deszkák esetében az a feladatunk, hogy az összes hasznos anyagot a shipment listából konvertáljuk és hozzáadjuk a planks_set listához, majd ezeket az int() függvénnyel alakítva összevonjuk a blue_storage változóban. Azonban, mint korábban, itt is hibákra kell számítani.
for y in range(6): planks_set[y]+=int(shipment[y]) player.speak(planks_set[y]) blue_storage+=int(planks_set[y])
Ezúttal Type Error-ra számíthatsz, ami akkor fordul elő, amikor számokat és karakterláncokat próbálsz összeadni. Ezt ismét a try / except és else kódrészletek használatával kezelheted: a try összeadja a listák elemeit, az except ág kiszűri a szemét elemeket a listából, az else ág pedig hozzáadja a deszkákat a blue_storage változóhoz.
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])
Most, hogy a blue_storage változó megtelt, dokumentálhatod és tárolhatod az összes fa deszkát. Menj a jobb oldali raktárban lévő arany X jel felé, állj a asztal elé, és használd a write() függvényt, hogy lejegyezd az egyesített anyagokat, például így: await player.write("There are %s planks ready for use in storage" % (blue_storage))
A szint véglegesítéséhez menj a kék szőnyegen lévő sötét X jel felé, és használd a place() függvényt a blue_storage változó dobozba helyezéséhez. Ezután menj a középső kamrában a lila szőnyegen lévő sötét X jelhez, és használd a place() függvényt, hogy a junk listát a hulladékgyűjtő csatornába dobd, ezzel befejezve a feladatot.