您的 f() 生成器函数只产生 一个 值。之后它耗尽并引发StopIteration。
>>> class A:
... pass
...
>>> def f():
... yield A()
...
>>> generator = f()
>>> generator
<generator object f at 0x10be771f8>
>>> next(generator)
<__main__.A object at 0x10be76f60>
>>> next(generator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
那是因为在f() 中没有循环 可以产生不止一次,生成器函数本身不会循环,只是因为你可以在中使用它 em> 一个循环。
请注意,对于赋值,Python 会先执行右侧表达式,然后再确定将其分配给到 的内容。所以next(it, None)首先被调用,分配的next(it).a被调用second。
f() 函数的主体与任何其他 Python 函数一样执行,但添加了 pausing。生成器上的next() 取消暂停代码,然后代码运行直到执行下一个yield 语句。然后该语句再次暂停生成器。如果函数改为结束(返回),则引发StopIteration。
在您的 f() 生成器中,这意味着:
- 当您调用
f() 时,会创建一个新的生成器对象。函数体已暂停。
- 你第一次打电话给
next()。代码开始运行,创建A() 的实例并生成该实例。该功能再次暂停。
- 您再次致电
next()。代码开始运行,到达函数末尾,然后返回。 StopIteration 被提出。
如果您向f() 添加一个循环,或者只是添加一个秒 yield 行,您的代码就可以工作:
def f():
yield A()
yield A()
或
def f():
while True:
yield A()