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

时间:2015-03-03 22:05:03

标签: python for-loop generator yield

我今天在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返回(或产生)我的列表中的一个元素,而不是产生它们的生成器吗?

第二个使用&#34; return&#34;表现如预期:

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

为什么会这样?文档中的哪个位置描述了这种行为?

1 个答案:

答案 0 :(得分:-4)

因为您的yield已嵌套在for循环中,所有值都将添加到生成器表达式中。生成器基本上等同于迭代器,除非迭代器保留值,除非删除,而生成器一次生成值。当在for循环而不是生成器中使用时,生成器的下一个方法被隐式调用。

此外,您必须记住,return关键字返回一个值,并且仅返回value和yield。该函数返回一个生成器对象,其yield已准备好生成所有提供的值。标准返回语句虽然返回一个值并退出该函数,但不返回其他值。