קורס פיתוח מתקדם בפייתון
פרק
>
רמה
פונקציות מתקדמות
סגירות
מטרה
ויסת את אספקת המים בחווה על ידי הקמת ושימוש בקלאוז'רים.
ישנם ארבעה מיכלי מים שתוכננו להשקיה של השדות שמסביב, זה הזמן להחליף אותם על מנת לוודא שהכמות הנכונה של מים מופצת למקומות הנכונים. כדי לעשות זאת נוכל להקל באופן משמעותי על העבודה על ידי שימוש בקלאוז'רים.
קלאוז'רים הם פונקציות מקוננות שנועדו לאקפסולציה של נתונים, מה שמפחית את מספר המשתנים שבהם יש להשתמש ומסתיר את הנתונים בתוך הפונקציה כך שלא יהיה ניתן לשנותם מבחוץ, במילים אחרות, סוגרים את הפונקציה.
כדי לסדיר את המים במיכלים, ניצור פונקציה מקוננת הפועלת כמכפיל. פונקציה זו עובדת באותה צורה כלולאה: הפונקציה החיצונית בשם multiplier_of() מקבלת ארגומנט שמוכפל בארגומנט של הפונקציה הפנימית שלה בשם multiplier().
# Nested Function
def multiplier_of(n):
def multiplier(number):
return number*n
return multiplier
לאחר ההתקנה, עלינו לסגור את הפונקציה על ידי הקמת קלאוז'רים, דבר שמונע גישה לערכיהם ומחזק את השימוש בהם.
# Set up Closure that multiplies any number by 2 multiply_by_2 = multiplier_of(2) # Uses closure to display a number on screen player.speak( multiply_by_2(4) ) # The number displayed is 8, the formula is [2 x 4 = 8]
הקלאוז'ר למעלה נקרא multiply_by_2() ומשתמש בפונקציה מקוננת שיצרנו עם ארגומנט קבוע, שהוא 2, שהוא המספר שעל פיו הקלאוז'ר מוגדר להכפיל. כתוצאה מכך, כל מספר שנוסיף כארגומנט יוכפל בשתיים (2) ותכונה זו לא ניתנת לשינוי בשל הסגירה.
נעבור לסידור מיכלי המים, הקם שלושה (3) קלאוז'רים: multiply_by_2, multiply_by_3 ו- multiply_by_5. הגדר כל אחד מהם ידנית תוך שימוש באותו הפורמט שהוצג בדוגמה הקודמת, כך: multiply_by_2 = multiplier_of(2).
ברמה זו קיים גם קבוע מילון בשם tanks, שבתור אינדקס הוא מכיל שישה (6) צבעים: “red”, “blue”, “orange”, “purple”, “yellow” ו- “green”. כל אינדקס מכיל מספר שמייצג כמה מים זורמים בצד של מיכל, מספר זה ישמש להסדרת המיכל על ידי שימוש בקלאוז'רים "multiply_by" אשר הוזכרו לעיל.
לשם כך, תוגדר פונקציה בעורך בשם regulate_water(), והיא מקבלת שני ארגומנטים: הצבע שמייצג את האינדקסים המתוארים לעיל והכפול שמייצג את קלאוז'ר המכפיל שיש להשתמש בו. דוגמה לשימוש בפונקציה היא כדלקמן: regulate_water(“red”, multiply_by_2).
לך לשטיחים הצבעוניים שמסומנים ב- X בחושך ועמוד מול המיכלים, השתמש בפונקציית regulate_water() והגדר את צבע השטיח כארגומנט הראשון ואת קלאוז'ר המכפיל הנכון כארגומנט השני. המכפילים שיש להשתמש בהם עבור כל שטיח צבע הם כדלקמן:
multiply_by_2 - "red" and "green" multiply_by_3 - "blue" and "purple" multiply_by_5 - "orange" and "yellow"
ווסת את המים בצידי כל אחד מהמיכלים על מנת להשלים את הרמה.