Menu
Coddy logo textTech

החריגה StopIteration

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

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

מהי StopIteration?

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

מתי StopIteration מועלת?

החריגה StopIteration מועלת באופן אוטומטי על ידי Python בשני תרחישים עיקריים:

  1. כאשר קוראים לפונקציה next() על איטרטור שאין בו עוד פריטים.
  2. כאשר המתודה __next__() של איטרטור מותאם אישית ממומשת כך שתעלה את StopIteration בסוף האיטרציה.

דוגמה ל-StopIteration

נראה כיצד StopIteration פועלת עם איטרטור פשוט:

my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator))  # פלט: 1
print(next(my_iterator))  # פלט: 2
print(next(my_iterator))  # פלט: 3
print(next(my_iterator))  # מעלה את החריגה StopIteration

בדוגמה הזאת, לאחר שעברנו על כל האיברים של my_list, הקריאה הבאה ל-next() מעלה חריגה מסוג StopIteration.

חשיבות בהתנהגות האיטרטור

החריגה StopIteration חיונית מכמה סיבות:

  1. סימון הסוף: היא מספקת סימן ברור לכך שהאיטרציה הגיעה לסופה.
  2. סיום לולאת for: לולאות for של Python מסתמכות על StopIteration כדי לדעת מתי להסתיים.
  3. שליטה באיטרטור מותאם אישית: בעת יצירת איטרטורים מותאמים אישית, העלאת StopIteration מאפשרת לך להגדיר מתי האיטרציה צריכה להסתיים.

טיפול ב-StopIteration

בעוד שלולאות for מטפלות ב-StopIteration באופן אוטומטי, בעת שימוש ישיר ב-next(), ייתכן שתרצה לטפל בחריגה הזאת במפורש:

my_iterator = iter([1, 2, 3])

try:
    while True:
        item = next(my_iterator)
        print(item)
except StopIteration:
    print("Iteration finished")

הקוד הזה ידפיס את המספרים 1, 2 ו-3, ולאחר מכן את "Iteration finished" כאשר החריגה StopIteration תיתפס.

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

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

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

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

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

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

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

challenge icon

אתגר

קל

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

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

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

האיטרטור שלך צריך:

  • לייצר מספרים ראשוניים החל מ-2
  • להעלות חריגת StopIteration כאשר המספר הראשוני הבא חורג מהגבול הנתון

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

הדפס כל מספר ראשוני שנוצר בשורה חדשה.

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

נסו בעצמכם

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

class PrimeIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 2

    def __iter__(self):
        return self

    def __next__(self):
        # TODO: ממשו את הלוגיקה ליצירת המספר הראשוני הבא
        # אם המספר הראשוני הבא חורג מהגבול, העלו StopIteration
        # החזירו את המספר הראשוני הבא אם הוא אינו חורג מהגבול
        pass

# צרו מופע של PrimeIterator
prime_iter = PrimeIterator(limit)

# עברו על המספרים הראשוניים והדפיסו כל אחד מהם
try:
    for prime in prime_iter:
        print(prime)
except StopIteration:
    pass  # סוף האיטרציה

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

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