פייתון - שימוש ב yield - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

פייתון - שימוש ב yield


syntex

Recommended Posts

שלום ,

כחלק מתרגיל אני אמור לממש פונקציה שמקבלת פונקציה ומחזירה פונקציה אחרת שמשמשת כ- iterator.

כלומר על הפלט אמור להיות : 0,2,4,6,8,10 וכו עבור הקוד.

כמובן שהמשימה היא לכתוב את הפונקציה make_iterator.

אך הפלט שיוצא לי הוא : <generator object some_f at 0x00000000025561F8>

אשמח להסבר מעמיק יותר איך עובד ה yield (להבנתי זה return רק שבקריאה הבאה לפונקציה היא תמשיך מאותו המקום והמשתנים יישמורו, לא?)


fn=lambda n: 2*n
def Make_iterator(fn):

def some_f():
j=0
yield fn(j)
j+=1

return some_f




iterator = Make_iterator(fn)
for i in range(4):
print(iterator())

for i in range(2,4):
print(iterator())


קישור לתוכן
שתף באתרים אחרים

לא. כשיש yield בתוך פונקציה, קריאה לפונקציה הזו לא מבצעת אותה אלא מחזירה לך אובייקט "גנרטור" שהוא Iterable. אובייקט כזה מייצג סדרה של איברים, ואפשר להפעיל עליו פונקציה בשם next, שכל קריאה לה מחזירה את האיבר "הבא" בסדרה.

פעם הראשונה שאתה קורא ל-next, הפונקציה מתחילה להתבצע ונעצרת בפעם הראשונה שהיא מגיעה ל-yield, וזה מה שה-next מחזירה. בפעם הבאה שתקרא ל-next הריצה של הפונקציה תמשיך מאותה נקודה, עד הפעם הבאה שמגיעים ל-yield. כך שוב ושוב עד שהפונקציה מסתיימת והקריאה ל-next מדווחת שאין יותר איברים.

באמצעות ה-next הזה אתה יכול להשתמש בגנרטור בתוך לולאת for (ככה שאתה לא באמת צריך לקרוא ל-next בעצמך), כמו שעושים עם range.

אני מציע לך לנסות לכתוב את הקוד הזה ב-python shell ותראה מה יקרה:


def f():
for i in range(5):
yield i*2

g = f()
next(g)
next(g)
next(g)
for x in range(f()):
print(x)

שחק עם זה קצת ותראה מה עוד קורה כל פעם שאתה קורא ל-f.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...