gpt4 book ai didi

python - 将列表理解与生成器表达式进行比较时出现意外结果

转载 作者:行者123 更新时间:2023-12-01 22:23:10 24 4
gpt4 key购买 nike

我认为我忽略了一些简单的事情,但我似乎无法弄清楚到底是什么。请考虑以下代码:

a = [2, 3, 4, 5]

lc = [ x for x in a if x >= 4 ] # List comprehension
lg = ( x for x in a if x >= 4 ) # Generator expression

a.extend([6,7,8,9])

for i in lc:
print("{} ".format(i), end="")

for i in lg:
print("{} ".format(i), end="")

我预计两个 for 循环会产生相同的结果,因此 4 5 。然而,打印生成器 exp 的 for 循环打印 4 5 6 7 8 9 。我认为这与列表理解的声明有关(在扩展之前声明)。但是为什么生成器的结果不同,因为它也是在扩展列表之前声明的呢?例如。内部发生了什么?

最佳答案

生成器在您调用 next() 之前不会被评估,这使得它们变得有用,而列表推导式会立即评估。

因此 lc = [4,5] 在扩展之前,因此完成。

lg 在开始时仍然是相同的值,因此 extend 仍然适用于尚未在内部完成评估的 a生成器,这意味着 a 在开始打印之前会被扩展,这就是为什么它会与其余数字一起打印更长的时间。

像这样检查一下:

>>> a = [2, 3, 4, 5]
>>> lg = ( x for x in a if x >= 4 )
>>> next(lg)
4
>>> next(lg)
5
>>> a.extend([6,7,8,9])
>>> next(lg)
6

但是,如果您在扩展之前尝试调用额外的 next() ,您将得到 StopIteration 因为生成器此时已耗尽,然后您将不会'无法再调用它了。

>>> a = [2, 3, 4, 5]
>>> lg = ( x for x in a if x >= 4 )
>>> next(lg)
4
>>> next(lg)
5
>>> next(lg)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> a.extend([6,7,8,9])
>>> next(lg)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

关于python - 将列表理解与生成器表达式进行比较时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58466555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com