2015-12-09 29 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不客氣。花點時間瞭解完成這項任務的不同方式。我專注於展示這個問題;不一定是'最好'或'最Pythonic'的方式。 – 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,我不知道有一個「收益來自」,但也有幫助,謝謝!我知道這不是無限的,但我忘了我可以將一個While和一個for循環嵌套在一起,從而使它無限。 – BrxttB