פייתון/פייתון גרסה 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