לדלג לתוכן

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