Итераторы (Iterators) в Python

Итераторы (Iterators) в Python


Итераторы (Iterators) в Python

Определение

Итератор — это объект, который позволяет последовательно перебирать элементы коллекции. Он реализует протокол итерации, состоящий из двух методов:

  1. __iter__(): Возвращает сам итератор.
  2. __next__(): Возвращает следующий элемент. Если элементов нет, вызывает исключение StopIteration.

Итерируемый объект (Iterable) — это объект, который может вернуть итератор (например, список, строка, словарь).


Встроенные итерируемые объекты

Большинство коллекций в Python являются итерируемыми:

  • Списки: [1, 2, 3]
  • Строки: "Hello"
  • Словари: {"a": 1, "b": 2}
  • Множества: {1, 2, 3}
  • Файлы: Открытые файлы тоже итерируемы (построчное чтение).
# Пример итерации по списку
for num in [1, 2, 3]:
    print(num)

Ручное управление итерацией

Для создания итератора используется функция iter(), а для получения следующего элемента — next().

Пример:

numbers = [10, 20, 30]
iterator = iter(numbers)  # Получение итератора

print(next(iterator))  # 10
print(next(iterator))  # 20
print(next(iterator))  # 30
print(next(iterator))  # StopIteration

Протокол итерации

Чтобы объект стал итератором, он должен реализовать:

  1. Метод __iter__(), возвращающий сам объект.
  2. Метод __next__(), возвращающий следующий элемент.

Пример кастомного итератора:

class Counter:
    def __init__(self, max_value):
        self.current = 0
        self.max = max_value

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.max:
            self.current += 1
            return self.current
        else:
            raise StopIteration

# Использование
counter = Counter(3)
for num in counter:
    print(num)  # 1, 2, 3

Итерируемый объект vs Итератор

Итерируемый объектИтератор
Может быть перебран в цикле forУправляет перебором элементов
Не хранит состояние итерацииХранит текущее состояние (позицию)
Пример: list, str, dictПример: объект, возвращаемый iter()

Важно:

  • Итератор одноразовый. После завершения перебора его нельзя использовать повторно.
  • Итерируемый объект при каждом вызове iter() создает новый итератор.

Range как итерируемый объект

Объект range в Python 3 — это ленивая последовательность, которая генерирует числа по требованию.

# Создание range
r = range(1, 5)  # 1, 2, 3, 4

# Преобразование в список
print(list(r))  # [1, 2, 3, 4]

# Итерация через цикл
for num in r:
    print(num)

Особенности:

  • Не хранит все числа в памяти (эффективно для больших диапазонов).
  • Поддерживает индексацию и срезы (например, r[2] → 3).

Примеры использования

1. Чтение файла построчно

with open("data.txt") as file:
    for line in file:  # Файл — итерируемый объект
        print(line.strip())

2. Бесконечный итератор (осторожно!)

import itertools

infinite = itertools.count(1)  # 1, 2, 3, ...
print(next(infinite))  # 1
print(next(infinite))  # 2
# ...

Заключение

  • Итераторы — основа циклов for, генераторов и многих других конструкций Python.
  • Итерируемые объекты создают новые итераторы при вызове iter().
  • Для создания кастомных итераторов реализуйте методы __iter__() и __next__().
  • Используйте range для работы с большими диапазонами чисел без нагрузки на память.

Совет: Для упрощения кода часто используют генераторы (ключевое слово yield), которые автоматически реализуют протокол итерации.