2015-10-13 80 views
5

我玩弄發電機,以便更好地瞭解他們的工作,但我很困惑與下面這段代碼的結果:Python的發電機:混亂的結果

>>> def gen(): 
... for i in range(5): 
... yield i 
... 
>>> count=gen() 
>>> for i in count: 
... print count.next() 
... 
1 
3 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
StopIteration 
>>> 

這是怎麼回事?看起來像它擊中「爲我計數:」行生成器產生第一個值。我不確定。

編輯:我應該補充一點,我並沒有試圖「弄清楚」。我試圖破解一些東西,看看Python如何反應。當我生成錯誤時,我會更多地瞭解該語言。這個錯誤讓我感到遺憾,但現在已經很清楚了。 到目前爲止,所有的答案都是簡短而甜蜜的。謝謝大家!

+2

'爲我計數'和'count.next()'都*都試圖獲得下一個項目 - 你爲什麼在同一個循環中使用它們? – jonrsharpe

回答

5

您的代碼應該是這樣的

代碼:

def gen(): 
    for i in range(5): 
     yield i 

count=gen() 
for i in count: 
    print i 

輸出:

0 
1 
2 
3 
4 

注:

當你循環for i in count你想了解我的下一個項目再次在這裏你想獲得的第二個元素。所以基本上你正試圖從當前位置

那麼在你的代碼的情況是如獲得元素+2 count.next()如下:

步驟:

1. for i in count這裏的下一個值是得了這是0

2.然後再print count.next()這裏值被稱爲和印刷成1印刷

3. for i in count這裏再次下一個值被稱爲是2

4. print count.next()這裏再次下一個值將被調用並且印刷成3印刷

5。 for i in count這裏再次調用下一個值,即4

6。終於在這裏你打電話print count.next(),因爲發電機沒有任何價值。你已經給了例外StopIteration

2

for i in count:已在接下來調用(並將值賦給i)。然後你的代碼再次調用。

如果你只是想打印的每個值

for i in count: 
    print i 

或圓形的很長的路要走

while True: 
    try: 
     print count.next() 
    except StopIteration, si: 
     break 
+0

你的「漫長的路」很有趣。我也會練習。 – solid

3

因爲「爲」循環已經迭代的發生器值,步步爲營兩個值產生:一個在「for」中,另一個在循環體中。

+0

我真的很喜歡你如何在一個句子中捕捉所有。我試圖制定一個簡短的答案,但我無法。 – solid