我今天在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'
为什么会这样?文档中的哪个位置描述了这种行为?
答案 0 :(得分:-4)
因为您的yield已嵌套在for循环中,所有值都将添加到生成器表达式中。生成器基本上等同于迭代器,除非迭代器保留值,除非删除,而生成器一次生成值。当在for循环而不是生成器中使用时,生成器的下一个方法被隐式调用。
此外,您必须记住,return关键字返回一个值,并且仅返回value和yield。该函数返回一个生成器对象,其yield已准备好生成所有提供的值。标准返回语句虽然返回一个值并退出该函数,但不返回其他值。