2015-12-09 3 views
0

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

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, что не что я хочу.

ответ

2

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

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

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

+0

Удивительное спасибо! Я не думал включать в себя как цикл while, так и for. Предыдущие итерации моего кода имели либо «i = range (1,13), а True: yield i» или просто «While True: yield i» с функцией, принимающей параметр «num». Спасибо за быстрый ответ! – BrxttB

+0

@BrxttB Добро пожаловать. Потратьте время, чтобы понять различные способы решения этой задачи. Я сосредоточился на том, чтобы показать проблему; не обязательно «лучший» или «самый путинский». – user2864740

+0

Я до сих пор в моем классе это в значительной степени, как мой профессор научил нас, как использовать генераторы. Я буду/прилагаю усилия, чтобы больше исследовать использование генераторов – BrxttB

3

Просто выполните цикл.

y = itertools.cycle(numGen()) 
+0

Это действительно работало, однако функция генератора должна иметь возможность бесконечно циклически проходить через нее. Я добавлю itertools в свой инструментарий для других проектов, хотя! – BrxttB

3

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

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

При завершении ввода чисел от 1 до 12 цикл снова запустит последовательность.

+0

Да, я использую Python 3.4, и я не знал, что есть «выход из», но это также помогает, спасибо! Я знал, что это не бесконечно, но я забыл, что я мог бы вложить время и цикл for, тем самым делая его бесконечным. – BrxttB

Смежные вопросы