Напиши генератор в Python, который бесконечно возвращает числа
Что проверяют
Знаете ли вы, что yield превращает функцию в ленивый итератор, и понимаете ли последствия бесконечности. Для тестировщика это ещё и прикладной навык: бесконечный генератор удобен как источник уникальных данных для автотестов, чтобы прогоны не сталкивались на одинаковых логинах.
Как отвечать
Покажите минимальный вариант и сразу способ его безопасно использовать:
def numbers(start=0, step=1):
n = start
while True:
yield n
n += stepfrom itertools import islice
gen = numbers()
first_ten = list(islice(gen, 10))Объясните механику: тело функции не выполняется до первого next, на yield выполнение замирает с сохранением локальных переменных и возобновляется с той же строки. Память не растёт, потому что значения не хранятся, а вычисляются по одному.
Добавьте, что готовый эквивалент уже есть в стандартной библиотеке, это itertools.count, и что для тестовых данных обычно удобнее генератор строк, а не чисел: логин или почта с растущим суффиксом. Если спросят про остановку, скажите про break, про islice и про метод close.
Где спотыкаются
Пишут цикл по генератору без выхода и вешают прогон до таймаута. Бесконечный источник всегда нарезается: islice, zip с конечной последовательностью или явный break по условию.
Путают генератор со списком. list от бесконечного генератора съест память, len к нему неприменим, а самое обидное, что исчерпанный генератор при повторном проходе молча отдаёт пусто, и второй тест на тех же данных падает без внятной причины.
Делают один генератор общим на весь прогон. Тесты начинают зависеть друг от друга через его состояние: запуск поодиночке даёт одни значения, запуск целиком другие, и упавший тест не воспроизводится. Источник данных создаётся на тест, а не на сессию.