В Python можно спутать две вещи: итерируемые объекты (iterables) и итераторы (iterators).
Итерируемые объекты — это объекты, которые можно перебирать, то есть из них можно извлекать значения по одному, возможно, бесконечно. Обычно итерируемыми объектами являются коллекции, такие как массивы, множества, списки и т. д.
Есть два способа сделать объект итерируемым. Первый — реализовать метод __getitem__
:
class Iterable:
def __getitem__(self, i):
if i > 10:
raise IndexError
return i
print(list(Iterable()))
Вывод:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Второй способ — определить метод
__iter__
, который возвращает итератор. Итератор — это объект, имеющий метод __next__
, который при каждом вызове возвращает следующее значение из исходного итерируемого объекта:
class Iterator:
def __init__(self):
self._i = 0
def __next__(self):
i = self._i
if i > 10:
raise StopIteration
self._i += 1
return i
class Iterable:
def __iter__(self):
return Iterator()
print(list(Iterable()))
Вывод:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Обычно итератор также имеет метод
__iter__
, который просто возвращает self
. Это позволяет самому итератору быть итерируемым, то есть большинство итераторов также являются итерируемыми объектами.👉@BookPython
>>Click here to continue<<