קורס פיתוח מתקדם בפייתון
פרק
>
רמה
טיפול בחריגות
סעיף אחרת
מטרה
קח חומרים לתיקון ומיין אותם, ואז זרוק פסולת לא רצויה על ידי שימוש בבלוק 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, ולאחר מכן נאחד את כולם לערימה אחת במשתנה blue_storage תוך שימוש ב- int(). אך גם כאן, כמו קודם, שגיאות צפויות להתרחש.
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 לתוך פתח הפסולת, ובכך להשלים את המשימה.