Menu
Coddy logo textTech

מימוש __next__()

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

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

המטרה של __next__()

למתודה __next__() יש שתי מטרות עיקריות:

  1. להחזיר את הפריט הבא ברצף
  2. להעלות חריגת StopIteration כשלא נותרו פריטים

מימוש __next__()

הנה מבנה בסיסי למימוש __next__():

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        result = self.data[self.index]
        self.index += 1
        return result

היבטים מרכזיים של __next__()

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

דוגמה: איטרטור טווח מותאם אישית

הנה דוגמה לאיטרטור מותאם אישית שמדמה גרסה פשוטה של range()</function>‎ של Python:</p> <pre><code class="language-python">class CustomRange: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self def __next__(self): if self.current >= self.end: raise StopIteration result = self.current self.current += 1 return result # שימוש באיטרטור הטווח המותאם אישית for num in CustomRange(1, 5): print(num) # פלט: 1, 2, 3, 4

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

כשמממשים את __next__(), מגדירים את ההתנהגות המרכזית של האיטרטור, וכך מאפשרים לו לעבוד בצורה חלקה עם מנגנוני האיטרציה של Python, כמו לולאות for והפונקציה next().

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

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

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

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

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

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

challenge icon

אתגר

קל

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

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

  • מספר שלם limit כקלט

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

  • לממש את המתודה __next__() כדי לייצר את מספר פיבונאצ'י הבא
  • לעצור את האיטרציה כאשר מספר פיבונאצ'י הבא יחרוג מהגבול הנתון
  • להעלות חריגת StopIteration כאשר הסדרה מסתיימת

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

הקלט יינתן כמחרוזת שמייצגת מספר שלם.

נסו בעצמכם

# קרא את הקלט
limit = int(input())

class FibonacciIterator:
    def __init__(self, limit):
        self.limit = limit
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        # TODO: ממש את המתודה __next__()
        # צור את מספר פיבונאצ'י הבא
        # העלה StopIteration כשהרצף מסתיים
        pass

# צור מופע של FibonacciIterator
fib_iterator = FibonacciIterator(limit)

# TODO: עבור על רצף פיבונאצ'י והדפס כל מספר

# הערה: הקפד להדפיס כל מספר פיבונאצ'י כדי לעבור את מקרי הבדיקה

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

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