קורס פיתוח מתקדם בפייתון
פרק
>
רמה
גנרטורים
התקדמות ידנית במחולל
מטרה
השתמש בגנרטור בסדר ידני כדי להרכיב ולהפיק חומרים להכנת לחם.
קדימה יש מתקן שבו תוכל להרכיב בצק לחם באמצעות הלחיצות. בדרך כלל היית משתמש בפונקציה combine() כדי להרכיב חומרים, אך זה לא המקרה כאן, החומרים צריכים לעבור זיקוק תחילה לפני שניתן להרכיב אותם.
למשימה זו נוכל להשתמש בגנרטורים שכן ניתן להתאים אותם להוציא סוגי קבצים שונים וכן ניתן לקרוא את הרצף שלהם לפי פקודה במקום להוציא אותם אוטומטית כמו שפונקציות ולולאות עושות. הנה דוגמה:
def bread():
yield 5
yield "grain"
הקוד לעיל כולל גנרטור עם שני הצהרות yield, אחת מהן מחזירה מספר ממשי והשנייה מחרוזת. אנחנו יכולים להפיק את ערכי הגנרטור כרצוננו באמצעות הפונקציה next(). ככה:
recipe = bread() # מכין את הגנרטור player.place(next(recipe)) # הערך הראשון נקרא player.collect(next(recipe)) # הערך השני נקרא
בדוגמה למעלה, הגנרטור מוכן והפונקציה next() משמשת יחד עם הגנרטור לקרוא את ערך ה-yield הראשון לשימוש בפונקציה place(). זה חוזר עם הערך השני אך במקום זה הוא משמש בפונקציה collect(). זה עושה את זה קל לקרוא ערכים מסוגים שונים בסדר מבלי להשתמש ברשימות או משתנים מרובים.
גנרטור בשם bread() יוגדר בעורך הקוד אבל יידרשו מספרי כמויות עבור כל מרכיב כדי שתוכל לזקק את בצק הלחם. מספרים אלה כתובים בשלט ליד המתקן. הכנס את הגנרטור לשימוש על ידי הפניה אליו, כך: recipe = bread()
ראשית טפס על סימון ה-X האור ליד מיכל החלב וcollect() את מה שנשאר מהחלב במיכל תוך שימוש בפונקציה next() מהגנרטור, כך: player.collect(next(recipe)). לאחר מכן טפס על סימון ה-X הזהוב ליד השלט והשתמש בפונקציה speak() כדי לקבל את מספרי הכמויות הנדרשים לגנרטור כדי להפיק את הלחם וכתוב אותם בגנרטור. הנתונים נשמרים בקבוע בשם "sign" ויש לקרוא להם כך: player.speak(sign).
כאשר כל הערכים הוכנסו בגנרטור, הכנס למתקן והשתמש ב-player.place(next(recipe)) על סימוני X כהים וב-player.collect(next(recipe)) על סימוני X בהירים כדי להשלים את הרמה.