פייתון/פייתון גרסה 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