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