Итераторы (Iterators) в Python
Итераторы (Iterators) в Python
Определение
Итератор — это объект, который позволяет последовательно перебирать элементы коллекции. Он реализует протокол итерации, состоящий из двух методов:
__iter__(): Возвращает сам итератор.__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
Протокол итерации
Чтобы объект стал итератором, он должен реализовать:
- Метод
__iter__(), возвращающий сам объект. - Метод
__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), которые автоматически реализуют протокол итерации.