Бесконечный повторяющийся генератор

Для конечного итерируемого объекта запоминайте элементы первого прохода, затем бесконечно повторяйте сохранённую последовательность. Пустой вход должен завершаться, иначе возникнет бесполезный бесконечный цикл.

Короткий ответ

Что ответить на собеседовании

Для конечного итерируемого объекта запоминайте элементы первого прохода, затем бесконечно повторяйте сохранённую последовательность. Пустой вход должен завершаться, иначе возникнет бесполезный бесконечный цикл.

Подробный разбор

Ответ с пояснениями

Условие

Создайте и задокументируйте генератор, который получает любой итерируемый объект и бесконечно выдаёт его элементы по порядку.

Пример 1: Ввод: "abc" Вывод: "a", "b", "c", "a", "b", ...

Пример 2: Ввод: [0, 1, 2] Вывод: 0, 1, 2, 0, 1, 2, ...

Ответ

Для конечного итерируемого объекта запоминайте элементы первого прохода, затем бесконечно повторяйте сохранённую последовательность. Пустой вход должен завершаться, иначе возникнет бесполезный бесконечный цикл.

Генератор поддерживает и одноразовые источники:

def repeat_forever(iterable):
    """Повторяет конечный источник; пустой источник сразу исчерпывается."""
    saved = []
    for item in iterable:
        saved.append(item)
        yield item
    while saved:
        yield from saved

Для 'abc' выдаются a, b, c, a, b, c и так далее. Сохраняются ссылки на объекты, не глубокие копии. Бесконечный источник никогда не завершит первый проход и будет бесконечно наращивать кеш: контракт повторения требует конечного входа либо отдельной ограниченной политики памяти.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее