Junior — Middle
Jak odróżnić iterator od obiektu obsługującego protokół iteracji?
sobes.tech AI
Odpowiedź od AI
W Pythonie iterator to obiekt, który implementuje metodę __next__() i metodę __iter__(), gdzie __iter__() zwraca sam obiekt. Obiekt obsługujący protokół iteracji (obiekt iterowalny) implementuje tylko metodę __iter__(), która zwraca iterator.
Mówiąc prościej:
- Obiekt iterowalny można używać w pętli
fori uzyskać z niego iterator przeziter(obj). - Iterator to obiekt, który ma metodę
__next__(), zwracającą następny element, i który sam jest iterowalny (czyliiter(iterator) == iterator).
Przykład:
lst = [1, 2, 3] # obiekt iterowalny
it = iter(lst) # iterator
print(hasattr(lst, '__iter__')) # True
print(hasattr(lst, '__next__')) # False
print(hasattr(it, '__iter__')) # True
print(hasattr(it, '__next__')) # True
print(next(it)) # 1
Zatem iterator to obiekt, którego można używać do pobierania elementów w kolejności, a obiekt iterowalny to kontener, z którego można uzyskać iterator.