Напечатайте бесконечную последовательность, используя генератор

Я пытаюсь создать генератор, который печатает указанную бесконечную последовательность. В настоящее время у меня есть следующий код:

def numGen():
for i in range(1,13):
    yield i

Что тогда дает мне:

>>> y = numGen()
>>> y
<generator object numGen at 0x7f6b88d22570>
>>> y.__next__()
1
...
>>> y.__next__()
12
>>> y.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module> StopIteration

Я не уверен, что нужно изменить, чтобы сбросить, а затем распечатать 1, 2, 3, ..., 11, 12, 1, 2, 3,... Я попытался добавить строка "i += 1" после линии доходности, но тогда она выведет 14, что не то, что я хочу.

3 ответа

Решение

Основная проблема с показанным генератором состоит в том, что он только зацикливает последовательность один раз - и затем он останавливается. Простое изменение будет заключаться в том, чтобы обернуть его во внешнем while TrueНапример:

def numGenForever():
    while True:
        for i in range(1,13):
           yield i

Тогда это будет "бесконечным", потому что он будет перезапускать итерацию последовательности после каждого предыдущего завершения.

Просто включите его.

y = itertools.cycle(numGen())

Если вы используете Python 3.3 или более позднюю версию, вы можете использовать yield from, который возвращает последовательные элементы из итерируемого. Затем вы можете поместить это в бесконечный цикл - так как в вашей функции нет ничего бесконечного.

def numGen():
    while 1:
        yield from range(1,13)

Когда он заканчивает давать числа от 1 до 12, цикл начнет последовательность снова.

Другие вопросы по тегам