Sobes.tech
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 for i uzyskać z niego iterator przez iter(obj).
  • Iterator to obiekt, który ma metodę __next__(), zwracającą następny element, i który sam jest iterowalny (czyli iter(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.