Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Работа с изключения
Клауза else
Цел
Вземете ремонтни материали и ги сортирайте, след което изхвърлете нежеланите отпадъци, като използвате 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 в отвода за боклук, завършвайки задачата.