Генераторы и итераторы – это два важных концепта в Python, связанных с эффективной обработкой последовательностей данных. Они позволяют работать с большими объемами данных или бесконечными последовательностями без необходимости загружать все данные в память сразу.
Итераторы:
- Итерируемый объект: Итератор – это объект, который реализует методы
__iter__()
и__next__()
. Он может быть использован в циклеfor
для последовательного доступа к его элементам. - Постепенная обработка: Итераторы обрабатывают элементы по одному за раз, не загружая всю последовательность данных в память. Это позволяет работать с большими наборами данных без необходимости выделения большого объема памяти.
- Нет поддержки индексации: Итераторы обычно не поддерживают прямую индексацию элементов, так как они проходят по последовательности в линейном порядке.
- Пример: Список, строка, множество и словарь – все они итерируемые объекты. Когда мы используем цикл
for element in iterable
, мы работаем с итератором.
Генераторы:
- Функциональные конструкции: Генератор – это функция, которая использует ключевое слово
yield
для возврата значений по мере необходимости. Генератор создает итератор автоматически. - Ленивая оценка (lazy evaluation): Генераторы не выполняются полностью сразу. Они генерируют значения по требованию, что позволяет эффективно работать с большими объемами данных.
- Пример: Генераторное выражение или функция, использующая
yield
, может быть генератором. Пример генераторного выражения:squared_numbers = (x**2 for x in range(10))
.
Вкратце, итераторы – это объекты, предоставляющие доступ к элементам последовательности, позволяя поочередное перебирать элементы. Генераторы – это функциональный способ создания итераторов, позволяющий лениво генерировать значения.