Напиши функцию-генератор чисел Фибоначчи в Python
Что проверяют
Понимаете ли вы, чем генератор отличается от функции, возвращающей список, и зачем нужна ленивость. Сама последовательность тут предлог, смотрят на yield и на то, как вы ограничиваете бесконечный поток значений.
Как отвечать
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + bОбъясните механику: вызов fib() не выполняет тело, а создаёт объект-генератор; тело оживает на первом next() и замирает на yield, сохраняя локальные переменные до следующего запроса. Отсюда главное свойство: в памяти живут два числа, а не вся последовательность, поэтому генератор можно сделать бесконечным.
Ограничивает его вызывающая сторона:
from itertools import islice
list(islice(fib(), 10)) # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34Стоит добавить, что генератор одноразовый: пройти по нему второй раз нельзя, длину и обращение по индексу он не поддерживает, для повторного обхода нужен новый вызов fib() или материализация в список. И что целые в Python произвольной точности, поэтому тысячное число посчитается без переполнения, просто небыстро.
Где спотыкаются
Возвращают список: функция считает n чисел, складывает в результат и отдаёт его целиком. Формально верно, но спрашивали про генератор, и ленивость с бесконечностью при таком ответе теряются.
Второе: пишут наивную рекурсию вида fib(n - 1) + fib(n - 2). Она экспоненциальна по времени и упирается в предел глубины рекурсии, а с lru_cache перестаёт быть рекурсией по духу, оставаясь ей по форме.
Третье: запускают обход бесконечного генератора без ограничителя и вешают процесс. Цикл for x in fib() сам не остановится, границу ставит только islice, break или внешний счётчик.