我知道我必须遗漏一些简单的东西,但我没有看到它。
如果我有这样的生成器表达式:
>>> 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
???我错过了什么?
答案 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)