Python 生成器表达式与产量:为什么不';t';next()';工作

Python 生成器表达式与产量:为什么不';t';next()';工作,python,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

我知道我一定错过了一些简单的东西,但我没有看到

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

>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
我可以很容易地生成这样的单个整数:

>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
如果我写一个这样的生成器:

>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
这不是布埃诺:

>>> ser().next()
0
>>> ser().next()
0
>>> ser().next()
0
???我错过了什么

ser()
每次初始化新的生成器

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

>>> 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
s = ser()
next(s) # next is preferred over .next which is why .next has been removed in Py3
next(s)
ser()
创建生成器。因此,每次调用
ser()
时,它都会向您发送一个新的生成器实例。您需要像表达式一样使用它:

serializer = ser()
serializer.next()
考虑一下,如果它不是这样工作的,您只能使用
ser()
函数一次,而且您永远无法重置它。另外,您可以更改ser函数以接受最大整数,并使程序更加灵活

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

在第二个示例中,您一直在创建一个新实例,从一个新的生成器开始

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

创建一次生成器并重用它

没问题。这显然是不明显的,因为其他主要类型的函数(装饰器)中有一个显式的
返回包装器
,我猜这是由
yield
语句隐式/神奇地创建的:P