Для конечного итерируемого объекта запоминайте элементы первого прохода, затем бесконечно повторяйте сохранённую последовательность. Пустой вход должен завершаться, иначе возникнет бесполезный бесконечный цикл.
Бесконечный повторяющийся генератор
Для конечного итерируемого объекта запоминайте элементы первого прохода, затем бесконечно повторяйте сохранённую последовательность. Пустой вход должен завершаться, иначе возникнет бесполезный бесконечный цикл.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте и задокументируйте генератор, который получает любой итерируемый объект и бесконечно выдаёт его элементы по порядку.
Пример 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 и так далее. Сохраняются ссылки на объекты, не глубокие копии. Бесконечный источник никогда не завершит первый проход и будет бесконечно наращивать кеш: контракт повторения требует конечного входа либо отдельной ограниченной политики памяти.