פייתון/פייתון גרסה 3/iterables

איטרבל עריכה

איטרבל (iterable) טיפוס שניתן לעבור עליו לפי סדר, נוצר באמצעות iter כגון range, או במילים אחרות ניתן להפעיל את לולאת for באופן כזה שהיא יכולה לעבור על אובייקט, אובייקט של הטיפוס.

iter אינו iter
str int
list טקסט התא
tuple טקסט התא
set טקסט התא
dict טקסט התא
file טקסט התא
range טקסט התא
frozenset טקסט התא

איטרטור עריכה

איטרטור (iterator) הוא האובייקט המאפשר מעבר על איברי טיפוס איטרלי נתון או לחילופין האובייקט שמחזיר ("או ממנו מקבלים") בכל פעם את האיבר הבא בתור.

# list is not an iterator therefor we can't use next on it:
lst = range(2)
>>> lst = range(2)
>>> next(lst)
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    next(lst)
TypeError: 'range' object is not an iterator


# but if we use the function iter:
iterator_steps = iter(lst)
print(next(iterator_steps))
>>>0
print(next(iterator_steps))
>>>1
print(next(iterator_steps))
>>>Traceback (most recent call last):
  File "C:/Users/user/Downloads/de/test.py", line 7, in <module>
    print(next(iterator_steps))
StopIteration

בדוגמה הראשונה אנו רואים כי לא ניתן להשתמש בפונקצית next מפני שרשימה אינה iterator.

בדוגמה השניה יצרנו iterator באמצעות פונקצית iter ומשתנה, רשימה שלנו שהיא iterable.

המשתנה iterator_steps הוא האיטרטור של lst מפני שהוא הגורם שמאפשר להדפיס את האיבר הבא.

iterator consumption: כשאשר הגענו לסופו של ה-iterable, כלומר האיטרטור "גמור" (consumed) התקבלה הודעת שגיאה StopIteration.

פונקצית iter עריכה

פונקצית iter מחזירה את כל איברי ה-iterable או לחילופין בדוגמה לעיל את כל ההדפסות של "iterator_steps":

בדומה לפונקציה לא ניתן להדפיסה ולכן יש צורך לקמפל אותה באמצעות פונקצית list,tuple,next וכו'.

x = iter([1,2,3,5])
print(x)
>>><list_iterator object at 0x000001D884050AC8>
print(tuple(x))
>>>(1, 2, 3, 5)

חיזוק ההבדל בין איטרטור ל-iterable עריכה

כל איטרטור מחזיר את עצמו כשקוראים לאיטרטור להבדיל מ-iterable.

x = iter([1,2,3,5])
y = iter(x)

print('x is [1,2,3,5] : ', x is [1,2,3,5])
>>>x is [1,2,3,5] :  False
print('x is y : ', x is y)
>>>x is y :  True
print('x is iter(x) : ', x is iter(x))
>>>x is iter(x) :  True