מימוש __next__()
שיעור 5 מתוך 13 בקורס איטרטורים ב-Python של Coddy.
המתודה __next__() היא חלק חיוני ביצירת איטרטורים מותאמים אישית ב-Python. היא מגדירה כיצד לקבל את הפריט הבא ברצף האיטרציה. כשמממשים את __next__(), שולטים בהתנהגות של האיטרטור וקובעים אילו ערכים הוא מפיק ומתי עליו לעצור.
המטרה של __next__()
למתודה __next__() יש שתי מטרות עיקריות:
- להחזיר את הפריט הבא ברצף
- להעלות חריגת
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().
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
אתגר
קלצרו מחלקת איטרטור מותאמת אישית בשם 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 אונליין