מימוש __iter__()
שיעור 4 מתוך 13 בקורס איטרטורים ב-Python של Coddy.
יצירת איטרטור מותאם אישית ב-Python כרוכה במימוש המתודה __iter__() במחלקה. המתודה הזו היא חלק חיוני מפרוטוקול האיטרטור ומאפשרת לך להגדיר כיצד האובייקט המותאם אישית שלך מתנהג כאיטרטור.
המתודה __iter__()
למתודה __iter__() יש שתי מטרות עיקריות:
- היא הופכת אובייקט לאובייקט שניתן לאיטרציה.
- היא מחזירה את אובייקט האיטרטור עצמו.
הנה המבנה הבסיסי של מחלקה עם מתודת __iter__():
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
מימוש __iter__()
כדי לממש את __iter__() במחלקה המותאמת אישית שלך:
- הגדירי את המתודה
__iter__()בתוך המחלקה שלך. - המתודה צריכה להחזיר את אובייקט האיטרטור עצמו (בדרך כלל
self).
הנה דוגמה לאיטרטור מותאם אישית פשוט:
class CountDown:
def __init__(self, start):
self.start = start
def __iter__(self):
# החזר את אובייקט האיטרטור (self)
return self
def __next__(self):
if self.start <= 0:
raise StopIteration
self.start -= 1
return self.start + 1
# שימוש באיטרטור המותאם אישית
countdown = CountDown(5)
for num in countdown:
print(num)
בדוגמה הזו, המתודה __iter__() מחזירה את self, וכך האובייקט CountDown הוא גם אובייקט שניתן לאיטרציה וגם האיטרטור של עצמו.
נקודות חשובות
- המתודה
__iter__()נקראת כשמשתמשים בפונקציהiter()על אובייקט או כשמשתמשים בו בלולאת for. - החזרת
selfב-__iter__()נפוצה כשהמחלקה מממשת גם את__iter__()וגם את__next__(). - אם המחלקה שלך מממשת רק את
__iter__(), עליה להחזיר אובייקט איטרטור נפרד שיש לו מתודת__next__().
באמצעות מימוש __iter__(), האובייקטים המותאמים אישית שלך הופכים לאובייקטים שניתן לבצע עליהם איטרציה, כך שאפשר להשתמש בהם בלולאות for ובפעולות אחרות המבוססות על איטרטורים ב-Python.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
אתגר
קלצרו מחלקת איטרטור מותאמת אישית בשם AlphabetIterator שמייצרת אותיות גדולות של האלפבית האנגלי. האיטרטור צריך להתחיל ב-'A' ולהמשיך עד לאות מוגדרת.
הקלט שיסופק לכם:
- אות גדולה אחת כקלט (למשל, 'E', 'K', 'Z')
המחלקה AlphabetIterator שלכם צריכה:
- לממש את המתודה
__iter__()כדי להפוך את האובייקט לאיטרטיבי - לייצר אותיות גדולות החל מ-'A'
- לעצור כשהיא מגיעה לאות הקלט שצוינה (כולל)
לאחר מימוש המחלקה AlphabetIterator, צרו מופע שלה באמצעות אות הקלט, והדפיסו כל אות שנוצרה בשורה חדשה.
הקלט יסופק כמחרוזת המכילה אות גדולה אחת.
נסו בעצמכם
# קרא את הקלט
end_letter = input().strip()
class AlphabetIterator:
def __init__(self, end_letter):
self.end_letter = end_letter
self.current_letter = 'A'
def __iter__(self):
return self
# TODO: ממש את המתודה __next__()
# צור מופע של AlphabetIterator
alphabet_iter = AlphabetIterator(end_letter)
# TODO: עבור על AlphabetIterator והדפס כל אות
# הערה: ודא שכל אות מודפסת בשורה חדשהכל השיעורים ביחידה איטרטורים ב-Python
תרגלו בעצמכם: קומפיילר Python אונליין