Итератор – это интерфейс, позволяющий перебирать элементы последовательности. Он используется, например, в цикле for … in …
, но этот механизм скрыт от глаз разработчика. При желании итератор можно получить «в сыром виде», воспользовавшись функцией iter()
.
Чтобы получить следующий элемент коллекции или строки, нужно передать итератор функции next()
.
Под капотом функциональность реализуется в методах __iter__
и __next__
.
Пример простого итератора:
class SimpleIterator: def __iter__(self): return self def __init__(self, limit): self.limit = limit self.counter = 0 def __next__(self): if self.counter < self.limit: self.counter += 1 return 1 else: raise StopIteration simple_iter = SimpleIterator(5) for i in simple_iter: print(i) # 1 # 1 # 1 # 1 # 1
На базе итераторов в языке появились новые элементы синтаксического сахара: выражения-генераторы и генераторы коллекций. Они позволяют устанавливать условия для отбора.
numbers = range(10) squared = [n ** 2 for n in numbers if n % 2 == 0] print(squared) # [0, 4, 16, 36, 64]
В этом примере из списка чисел отбираются четные числа, а в финальную коллекцию вносятся их квадраты.
Выражения-генераторы не создают целый список заданной длины сразу, а добавляют элементы по мере необходимости.
Очевидно, что генераторы могут выполнять работу функций map
и filter
. Более того, они справляются с этой задачей эффективнее.