Generator Expression vs yield:为什么'next()'不起作用?

时间:2012-06-09 05:55:50

标签: python

我知道我必须遗漏一些简单的东西,但我没有看到它。

如果我有这样的生成器表达式:

>>> 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

???我错过了什么?

3 个答案:

答案 0 :(得分:21)

ser()创建生成器。因此,每次调用ser()时,它都会向您发送一个新的生成器实例。您需要像表达式一样使用它:

serializer = ser()
serializer.next()

考虑一下,如果没有以这种方式工作,你只能使用ser()函数一次,而你永远无法重置它。另外,您可以更改ser函数以接受最大整数,并使您的程序更加灵活。

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

答案 1 :(得分:5)

在第二个示例中,您将继续创建一个新实例,从新生成器开始。

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

创建一次生成器并重复使用它。

答案 2 :(得分:4)

ser()
每次

初始化生成器。

要修复它,请执行以下操作:

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