为什么这段代码会产生一个生成器?

Why does this code yield a generator?

我今天在 Python 解释器中写入了以下内容:

>>> def test():
...     for c in ['a', 'b', 'c', 'd']: yield c
...
>>> a = test()
>>> a
<generator object test at 0x2556a00>
>>> a.next()
'a'
>>> a.next()
'b'

这让我很惊讶。不应该 test return (或产生)我列表中的元素之一,而不是产生它们的生成器?

使用 "return" 的第二个函数按预期运行:

>>> def test2():
...     for i in ['a', 'b', 'c', 'd']: return i
...
>>> b = test2()
>>> b
'a'
>>> b
'a'

为什么会这样?文档中的何处描述了此行为?

因为您的 yield 嵌套在您的 for 循环中,所以您的所有值都将添加到生成器表达式中。生成器基本上等同于迭代器,除了迭代器会保留值,除非删除,而生成器会即时生成值。生成器的 next 方法在 for 循环而不是生成器中使用时顺便隐式调用。

此外,您必须记住 return 关键字 return 和 yield 一样,也是唯一一个关于值的关键字。函数 return 是一个具有 yield 的生成器对象,可以生成所有提供的值。标准 return 语句虽然 return 是一个值并退出该函数,以便其他值不被 return 编辑。