our_generator = my_range(1000)
for number in our_generator:
print(number)
מדוע אי אפשר להדפיס כך:
print(next(my_range(1000)) הרי לכאורה אני מקבל כל פעם נקסט של הסמן שנמצא במקום הראשון, לא כך?
ועוד יותר, שה our_generator תמיד מצביע לאותו מיקום אחרי כל קריאה, אז מה הולך כאן?
תודה
orpazf
כשאתה כותב next(my_range(1000)) אתה מאתחל גנרטור חדש אליו אתה שולח את המספר 1000, ומבקש ממנו את האיבר הבא שלו - במקרה הזה הראשון, 0. לאחר מכן אתה עובר לאיטרציה הבאה, מאתחל גנרטור חדש, ומבקש ממנו את האיבר הבא שלו - במקרה הזה הראשון, 0. כך שוב ושוב ושוב
sgshlomi
אם כן, לא ברור למה ה Next עובד על our_generator ?
כי הרי לפי ההסבר ה generator מחזיר כל פעם את האיבר הראשון שבו אז מה זה משנה אם זה במשתנה אחר או בו עצמו?
ואם המשתנה our_generator כן יכול להתקדם אז למה הגנרטור עצמו לא?
orpazf
הגנרטור מחזיר כל פעם את האיבר הראשון רק אם אתה מאתחל אותו כל פעם מחדש, אם אתה ניגש לאותו גנרטור ולא זונח אותו לטובת גנרטור חדש אז הוא מחזיר את הערכים הבאים
כל פעם שאתה מבצע my_range(20) אתה מאתחל גנרטור חדש. מה שאתה רוצה לעשות זה לרוץ על גנרטור אחד הרבה פעמים, לא לרוץ הרבה פעמים על הרבה גנרטורים
sgshlomi
אבל איפה זנחתי כאן לטובת גנרטור חדש? קראתי לאותו גנרטור שוב ושוב לא?
או שאני מקבל מצב שם (השמה) במשתנה מסוים, ועליו אני רוץ?
ומה פירוש אם כך לרוץ על גנרטור 1?
orpazf
כל קריאה עם שם הגנרטור יוצר אחד חדש. אם אתה רוצה לרוץ על אותו אחד אתה צריך לאתחל גנרטור חדש ולשמור אותו, כמו שאתה עושה בשורה הזו our_generator = my_range(1000), ואז אתה יכול לרוץ עליו כמה פעמים שתרצה בלולאת ה-for שלך
לייק 1
sgshlomi
אז אפשר לומר שה our_generator שומר בעצם מצב שבו יש הצבעה לאיבר הראשון?
ברגע שאני שומר לאיבר הראשון אני יכול לרוץ ממנו והלאה בלי לחזור לאותו האיבר שהגנרטור מוציא ( שהוא הראשון כל פעם)
Yam
קריאה ל־generator יוצרת חץ לשורה הראשונה שלו.
אתה פשוט כל פעם יוצר מחדש “חץ” מחדש לשורה הראשונה ומתחיל להריץ ממנו בעזרת next.
במקום זאת, שמור את החץ על משתנה מחוץ ללולאה על משתנה, נניח בשם humpty_dumpty, ותריץ את החץ בעזרת next