פייתון/פייתון גרסה 3/גנרטור
גנרטור מייצר איטרטור, אובייקט המאפשר מעבר על איברי טיפוס iterable.
מבנה
עריכהמבנה הגנרטור דומה למבנה של פונקציה אך במקום ערך החזרה return הוא מסתיים ב-yeild (ולכן מחזיר טיפוס מסוג גנרטור):
def <name>(<parameters >):
'''documentation'''
<Statements>
yield
הבדל בין פונקציה לגנרטור
עריכההגנטור, להבדיל מפונקציה המחזירה ערך החזרה פעם אחת, מחזיר בכל קריאה אליו את ערך החזרה הבא.
כאשר יסתיימו "ערכי החזרה" בגנרטור נקבל פקודת stopIteration:
def hello_world_generator():
yield "hello"
yield "world"
שמו לב שבדומה לפונקציה בכדי לקבל את הערכים "שמחזירה" הפונקציה לא נוכל להשתמש בפונקצית ההדפס שמחזירה את המיקום, נוסיף ונראה מה נקבל :
calling_hello_world_fun = hello_world_generator()
>>><generator object hello_world_generator at 0x04513810>
על כן נעזר בפונקציות שונות להצגת ערכי הגנרטור.
פונקצית next
עריכהבמקום ניתן לבצע השמה עם קריאה לפונקציה ולהשתמש בפונקצית next (ניתן גם בפונקציות אחרות כמו list ועוד).
פונקצית next מחזירה את ערך האיטרטור הנוכחי ובכל קריאה מקדמת את המצביע לאיבר הבא באיטרטור:
def hello_world_generator():
yield "hello"
yield "world"
>>>print(next(calling_hello_world_fun))
hello
>>>print(next(calling_hello_world_fun))
world
>>>print(next(calling_hello_world_fun))
Traceback (most recent call last):
File "C:calling_hello_world.py", line 9, in <module> print(next(calling_hello_world_fun))
StopIteration
יתרונות
עריכההיתרון של גנטור הוא חסכון במקום מפני שמחזיק את הערך הנוכחי שלו.
להלן דוגמה לגנרטור אינסופי :
def generator_non_stop():
number = 1
while True:
yield number
number +=1
calling_function = generator_non_stop()
>>>print(next(calling_function))
1
>>>print(next(calling_function))
2
>>>print(next(calling_function))
3
yield from
עריכהyield from מאפשר לקבל את כל ערכי הגנרטור מבלי להשתמש שוב ושוב בפונקצית next.
def hello_world_generator():
yield "hello"
yield "world"
def python_added_genetator():
yield from hello_world_generator()
yield "python"
print(list(python_added_genetator()))
>>>['hello', 'world', 'python']
ביטוי גנרטור (generator expression)
עריכהבדומה לביטוי למדא ניתן לייצר ביטוי של גנרטור באופן מקוצר. להבדיל מביטוי למדא, במקרה זה נייצר את ביטוי הגנרטור באמצעות סוגרים מעוגלים במקום מרובעים. על היתרון ניתן לקרוא בביטוי למדא.
generator_of_squares = (i**2 for i in range(5))
print(next(generator_of_squares),
next(generator_of_squares),
next(generator_of_squares))
>>>0 1 4