2012-06-09 26 views
5

我知道我必須缺少一些簡單的東西,但我沒有看到它。生成器表達式與產量:爲什麼不是'next()'工作?

如果我有一個發生器表達這樣的:

>>> serializer=(sn for sn in xrange(0,sys.maxint)) 

我可以生成,容易,單獨整數像這樣:

>>> serializer.next() 
0 
>>> serializer.next() 
1 
>>> serializer.next() 
2 

如果我寫這樣的發生器:

>>> def ser(): 
... for sn in xrange(0,100000): 
...  yield sn 

這是沒有bueno:

>>> ser().next() 
0 
>>> ser().next() 
0 
>>> ser().next() 
0 

???我錯過了什麼?

回答

19

ser()造成發電機。因此,每次您撥打ser()時,都會向您發送一個新的生成器實例。你需要使用它,就像在表達:

serializer = ser() 
serializer.next() 

考慮到,如果它沒有以這種方式工作,你只能用不完ser()功能一次,你永遠無法復位。另外,您可以更改ser函數以接受最大整數,並使您的程序更加靈活。

def ser(n=sys.maxint): 
    for sn in xrange(0, n): 
     yield sn 
+1

Thx!我知道它必須簡單... – dawg

+2

沒問題。它絕對不是顯而易見的,因爲執行此操作的其他主要類型的函數(裝飾器)在它們中都有一個明確的'return wrapper',我猜是通過'yield'語句隱式/神奇地創建的:P –

4
ser() 

初始化每次發生器。

要修復它做這樣的事情:

s = ser() 
next(s) # next is preferred over .next which is why .next has been removed in Py3 
next(s) 
5

在第二個示例中,您將繼續創建一個新實例,並以新的生成器開始。

g = ser() 
g.next() 
g.next() 

創建一次發生器並重新使用它。

相關問題