Generator והדפסות

תגיות:

שלום
אם לדוגמה יש את הגנרטור הבא:

def my_range(upper_limit):
current_number = 0
while current_number < upper_limit:
yield current_number
current_number = current_number + 1

our_generator = my_range(1000)
for number in our_generator:
print(number)

מדוע אי אפשר להדפיס כך:
print(next(my_range(1000)) הרי לכאורה אני מקבל כל פעם נקסט של הסמן שנמצא במקום הראשון, לא כך?
ועוד יותר, שה our_generator תמיד מצביע לאותו מיקום אחרי כל קריאה, אז מה הולך כאן?
תודה

כשאתה כותב next(my_range(1000)) אתה מאתחל גנרטור חדש אליו אתה שולח את המספר 1000, ומבקש ממנו את האיבר הבא שלו - במקרה הזה הראשון, 0. לאחר מכן אתה עובר לאיטרציה הבאה, מאתחל גנרטור חדש, ומבקש ממנו את האיבר הבא שלו - במקרה הזה הראשון, 0. כך שוב ושוב ושוב :slight_smile:

אם כן, לא ברור למה ה Next עובד על our_generator ?
כי הרי לפי ההסבר ה generator מחזיר כל פעם את האיבר הראשון שבו אז מה זה משנה אם זה במשתנה אחר או בו עצמו?
ואם המשתנה our_generator כן יכול להתקדם אז למה הגנרטור עצמו לא?

הגנרטור מחזיר כל פעם את האיבר הראשון רק אם אתה מאתחל אותו כל פעם מחדש, אם אתה ניגש לאותו גנרטור ולא זונח אותו לטובת גנרטור חדש אז הוא מחזיר את הערכים הבאים


לכאורה כאן לא?

כל פעם שאתה מבצע my_range(20) אתה מאתחל גנרטור חדש. מה שאתה רוצה לעשות זה לרוץ על גנרטור אחד הרבה פעמים, לא לרוץ הרבה פעמים על הרבה גנרטורים

אבל איפה זנחתי כאן לטובת גנרטור חדש? קראתי לאותו גנרטור שוב ושוב לא?
או שאני מקבל מצב שם (השמה) במשתנה מסוים, ועליו אני רוץ?
ומה פירוש אם כך לרוץ על גנרטור 1?

כל קריאה עם שם הגנרטור יוצר אחד חדש. אם אתה רוצה לרוץ על אותו אחד אתה צריך לאתחל גנרטור חדש ולשמור אותו, כמו שאתה עושה בשורה הזו our_generator = my_range(1000), ואז אתה יכול לרוץ עליו כמה פעמים שתרצה בלולאת ה-for שלך

לייק 1

אז אפשר לומר שה our_generator שומר בעצם מצב שבו יש הצבעה לאיבר הראשון?
ברגע שאני שומר לאיבר הראשון אני יכול לרוץ ממנו והלאה בלי לחזור לאותו האיבר שהגנרטור מוציא ( שהוא הראשון כל פעם)

קריאה ל־generator יוצרת חץ לשורה הראשונה שלו.
אתה פשוט כל פעם יוצר מחדש “חץ” מחדש לשורה הראשונה ומתחיל להריץ ממנו בעזרת next.
במקום זאת, שמור את החץ על משתנה מחוץ ללולאה על משתנה, נניח בשם humpty_dumpty, ותריץ את החץ בעזרת next

2 לייקים

תודה :slightly_smiling_face: