איטרטורים בפייתון

איטרטורים בפייתון

מאמר זה מסביר את נושא האיטרטורים בפייתון.

YouTube Video

איטרטורים בפייתון

סקירה כללית

בפייתון, איטרטור הוא מנגנון בסיסי לעיבוד איברים באוספים כגון רשימות, טופלים ומילונים, אחד אחד.

מהו איטרטור?

איטרטור הוא אובייקט שיכול להחזיר איבר אחד בכל פעם. בפייתון, אובייקט נחשב לאיטרטור אם הוא עונה על שני התנאים הבאים:.

  • יש לו מתודה __iter__() שמחזירה את עצמו.
  • יש לו מתודה __next__() שמחזירה את האיבר הבא. הוא מעלה את החריגה StopIteration כאשר אין יותר איברים.
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • בקוד זה, הפונקציה iter() משמשת להמרת רשימה לאיטרטור, והפונקציה next() משמשת לקבלה ולהצגה של כל איבר אחד־אחד.

הבדל מאובייקט איטרלי (Iterable)

אובייקט איטרלי (Iterable) הוא אובייקט שמממש את המתודה __iter__() וניתן להשתמש בו בלולאת for. רשימות וטופלים הם דוגמאות לאובייקטים איטרליים (Iterables).

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • קוד זה הוא דוגמה לקבלת איטרטור מאובייקט איטרבילי כמו רשימה ושליפת איברים בסדר בעזרת next().

כיצד לבדוק:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • קוד זה מאשר כי nums הוא איטרבילי אך לא איטרטור, בעוד ש־it, שהושג על־ידי שימוש ב־iter(nums), הוא איטרטור.

הקשר בין לולאות for ואיטרטורים

לולאת for בפייתון פועלת פנימית כך:.

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • כפי שמוצג, לולאת for עושה שימוש באיטרטור לצורך האיטרציה.

יצירת איטרטור מותאם אישית

ניתן ליצור איטרטור מותאם אישית באמצעות מחלקה (class).

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • קוד זה מגדיר איטרטור מותאם אישית שסופר אחורה בעזרת המחלקה Countdown ומדפיס את המספרים מ־3 עד 1 באמצעות לולאת for.

הבדל בין איטרטורים לג'נרטורים, ומתי להשתמש בכל אחד מהם

ג'נרטורים מספקים פונקציונליות דומה לאיטרטורים. הם מאפשרים להגדיר איטרטורים באופן מתומצת יותר.

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • קוד זה מגדיר פונקציית גנרטור שסופרת אחורה בעזרת yield, ומדפיסה את המספרים מ־3 עד 1 באמצעות לולאת for.

הבדלים בין איטרטורים (מחלקה) וג'נרטורים (פונקציה)

ישנם ההבדלים הבאים בין איטרטורים (מחלקות) לגנרטורים (פונקציות):.

מאפיין איטרטור (מחלקה) ג'נרטור (פונקציה)
הגדרה __iter__() + __next__() פונקציה המשתמשת ב-yield
ניהול מצב דרוש ניהול תכונות ידני שמירת מצב אוטומטית
קריאות עלול להיות מורכב פשוט וברור
  • הבדל באופן ההגדרה איטרטור מוגדר על ידי כתיבת שתי מתודות באופן ידני: __iter__() ו-__next__(). לעומת זאת, ג'נרטור הוא פשוט פונקציה המשתמשת במילת המפתח yield, מה שהופך את הקוד לפשוט בהרבה.

  • הבדל בניהול מצב באיטרטור, יש לנהל את המצב הנוכחי וההתקדמות באופן ידני בעזרת משתנים. לעומת זאת, ג'נרטורים שומרים אוטומטית את מצבם באופן פנימי בפייתון, ומפחיתים את הצורך בעבודה ידנית.

  • קריאות קוד איטרטורים נוטים להיות מורכבים כי הם דורשים מספר מתודות וניהול מצב ידני. לעומת זאת, ג'נרטורים משתמשים בתחביר פשוט, מה שמקל על ההבנה גם למתחילים.

ספריה סטנדרטית לעבודה עם איטרטורים: itertools

itertools, ספריה סטנדרטית של פייתון, מספקת כלים חזקים לעבודה עם איטרטורים.

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • היא כוללת גם פונקציות רבות נוספות כגון cycle, repeat, chain, islice, ו-tee.

שימושים לאיטרטורים

מקרי השימוש עבור איטרטורים כוללים את הבאים:.

  • עיבוד שורות מקובץ: קריאת שורות אחת אחרי אחת מקובץ כאיטרטור.
  • עיבוד חסכוני בזיכרון: עיבוד כמות גדולה של נתונים ברצף.
  • ייצוג רצפים אינסופיים: שימוש בפונקציות כמו itertools.count().

סיכום

  • איטרטור הוא אובייקט שיכול לאחזר את הערך הבא ברצף.
  • ניתן ליצור איטרטור מותאם אישית על ידי הגדרת __iter__() ו-__next__().
  • הם מטופלים אוטומטית דרך לולאות for או פונקציית next().
  • שימוש בג'נרטורים או ב-itertools מאפשר עיבוד יעיל יותר.

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

תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.

YouTube Video