这样的生成器表达式:
my_nums = (item for item in [1, 2, 3, 4, 5, 6, 7])
是这样的语法糖:
def generator(iterable):
for item in iterable:
yield item
my_nums = generator([1, 2, 3, 4, 5, 6, 7])
forloop 本身就相当于这样:
while True:
try:
item = next(my_nums)
except StopIteration:
break
else:
print(item)
因为gg = list(iterable) 类似于:
gg = []
for item in my_nums:
gg.append(item)
问题是第一次循环生成器表达式时,它已经用尽了。如果您尝试再次循环它,它只会引发 StopIteration 并中断循环。
例如:
>>> my_nums = (i for i in [1, 2])
>>> list(my_nums)
[1, 2]
>>> list(my_nums)
[]
>>> next(my_nums)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
看看你第二次调用list(my_nums)它是如何返回一个空列表的?这是因为发电机已耗尽。如果您尝试从中获取下一个项目,您可以看到它是如何引发 StopIteration 的。