Python迭代生成器返回的项。

3

我试图理解生成器的工作原理。

Python 3.8.1 (default, Dec 31 2019, 18:44:59) 
[GCC 5.4.0 20160609] on linux
>>> def gen():
...     yield '123'
... 
>>> list(gen())
['123']
>>> list(next(gen()))
['1', '2', '3']

请解释为什么在使用next()时,Python会迭代一个项目。

只是为了明确,我对Python在第二种情况下迭代一个项目的原因感兴趣。在第一种情况下,它只是在列表中添加一个项目。 - Andrei Puzanau
1个回答

4

这是因为你的生成器使用 '123' 作为 yield 值,其数据类型是 str。因此 next(gen()) 返回的数值也是相同的。这就是 list(str) 的工作方式。

你可以尝试以下代码:

test = '123' # str
print(list(test)) # will also print ['1', '2', '3']

3
好的答案,我想强调一下以便让OP清楚 - 这种行为与gen()是生成器没有任何关系。这只是list(str)的工作原理。 - DeepSpace
在第一种情况下,生成器也返回str,不是吗?但Python只是将此项添加到列表中而不进行迭代。 - Andrei Puzanau
2
@AndreiPuzanau 不同之处在于,第一种情况下您会遍历整个生成器(恰好只产生一个元素),而在第二种情况下,您会遍历该元素本身。 - tobias_k
@AndreiPuzanau 第一个例子在远程上等同于 list(['123']),即 ['123'] - DeepSpace
1
感谢大家,现在清楚了发生了什么。 - Andrei Puzanau
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接