Что такое генератор? Разница между генераторами и итераторами?
1. Итератор
Итератор — это объект, который позволяет проходить по последовательности (список, строка, кортеж) один элемент за раз.
Итератор реализует методы:
__iter__()
— возвращает сам объект итератора__next__()
— возвращает следующий элемент, при достижении конца выдаётStopIteration
Пример итератора
lst = [1, 2, 3]
it = iter(lst)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
# print(next(it)) # StopIteration
2. Генератор
Генератор — это специальный итератор, который создаёт элементы "на лету" при каждой итерации.
Экономит память, особенно для больших последовательностей.
Создаётся с помощью:
Функций с
yield
Генераторных выражений (
(...)
вместо[...]
)
2.1 Функция-генератор
def my_gen(n):
for i in range(n):
yield i # возвращает по одному элементу за раз
gen = my_gen(5)
for val in gen:
print(val)
Вывод:
0
1
2
3
4
2.2 Генераторное выражение
gen_exp = (x**2 for x in range(5))
print(next(gen_exp)) # 0
print(next(gen_exp)) # 1
3. Разница между генератором и обычным итератором
Создание
Через iter()
Функция с yield
или (x for x in ...)
Память
Элементы хранятся полностью
Элементы создаются по мере запроса
Ключевой метод
__next__()
__next__()
(реализован автоматически)
Использование
Любая последовательность
Большие последовательности, ленивые вычисления
Можно ли пересоздать
Да (создать новый итератор)
Нет, генератор один раз исчерпывается
4. Применение в автотестах
Обработка больших логов или API-данных без загрузки всего в память.
Генерация тестовых данных на лету:
def test_data(n):
for i in range(n):
yield {"username": f"user{i}", "password": "123"}
Используется в pytest с
@pytest.mark.parametrize
, когда много комбинаций данных.
💡 Вывод:
Генератор = ленивый итератор, экономит память.
Итератор = объект последовательности, по которому можно пройтись с
next()
.
Last updated
Was this helpful?