Menu
Coddy logo textTech

איטרטורים אינסופיים

שיעור 6 מתוך 13 בקורס איטרטורים ב-Python של Coddy.

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

מאפיינים של איטרטורים אינסופיים

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

יצירת איטרטור אינסופי

הנה דוגמה פשוטה לאיטרטור אינסופי שיוצר רצף אינסופי של מספרים שלמים:

class InfiniteCounter:
    def __init__(self, start=0):
        self.count = start

    def __iter__(self):
        return self

    def __next__(self):
        current = self.count
        self.count += 1
        return current

# שימוש
counter = InfiniteCounter()
for i in counter:
    print(i)
    if i >= 5:
        break  # מניעת לולאה אינסופית

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

איטרטורים אינסופיים מובנים

המודול itertools של Python מספק כמה איטרטורים אינסופיים שימושיים:

  • itertools.count(start, step): סופר כלפי מעלה ללא הגבלה, החל מערך התחלתי
  • itertools.cycle(iterable): עובר שוב ושוב על מבנה שניתן לאיטרציה ללא הגבלה
  • itertools.repeat(elem, [n]): חוזר על איבר ללא הגבלה או n פעמים

דוגמה לשימוש ב-itertools.count():

from itertools import count

for i in count(10):
    print(i)
    if i >= 15:
        break
# פלט: 10, 11, 12, 13, 14, 15

אזהרות ושיטות עבודה מומלצות

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

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

quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

challenge icon

אתגר

קל

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

הנתונים הבאים ניתנים לכם:

  • שני מספרים שלמים כקלט: start ו-end (כולל)

המחלקה CyclicCounter שלכם צריכה:

  • לממש את המתודות __iter__() ו-__next__()
  • לייצר מספרים מ-start עד end (כולל)
  • לאחר ההגעה ל-end, לחזור ל-start ולהמשיך ללא הגבלה

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

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

נסו בעצמכם

# קראו את הקלט
start, end = map(int, input().split())

class CyclicCounter:
    def __init__(self, start, end):
        self.start = start
        self.end = end
        self.current = start

    def __iter__(self):
        return self

    # TODO: ממשו את המתודה __next__()

# צרו מופע של CyclicCounter
counter = CyclicCounter(start, end)

# TODO: השתמשו בלולאה כדי להדפיס את 10 המספרים הראשונים שהאיטרטור מייצר

# זכרו להדפיס כל מספר בשורה חדשה

כל השיעורים ביחידה איטרטורים ב-Python

תרגלו בעצמכם: קומפיילר Python אונליין