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

daw*_*awg 7 python

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

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

>>> serializer=(sn for sn in xrange(0,sys.maxint))
Run Code Online (Sandbox Code Playgroud)

我可以很容易地生成这样的单个整数:

>>> serializer.next()
0
>>> serializer.next()
1
>>> serializer.next()
2
Run Code Online (Sandbox Code Playgroud)

如果我写这样的生成器:

>>> def ser():
...    for sn in xrange(0,100000):
...       yield sn
Run Code Online (Sandbox Code Playgroud)

这不是bueno:

>>> ser().next()
0
>>> ser().next()
0
>>> ser().next()
0
Run Code Online (Sandbox Code Playgroud)

??? 我错过了什么?

Jef*_*ner 21

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

serializer = ser()
serializer.next()
Run Code Online (Sandbox Code Playgroud)

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

def ser(n=sys.maxint):
    for sn in xrange(0, n):
        yield sn
Run Code Online (Sandbox Code Playgroud)

  • 没问题.这肯定是不明显的,因为执行此操作的其他主要类型的函数(装饰器)中有一个显式的`return wrapper`,我猜这是由`yield`语句隐式/神奇地创建的:P (2认同)

jdi*_*jdi 5

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

g = ser()
g.next()
g.next()
Run Code Online (Sandbox Code Playgroud)

创建一次生成器并重用它.