gpt4 book ai didi

python - 在生成器上使用 continue

转载 作者:行者123 更新时间:2023-11-30 23:20:32 24 4
gpt4 key购买 nike

我尝试使用 continue 函数跳过不满足某些条件的生成项目。

如果我只是打印 x 我会得到完整的输出:

>>> w = [1,4,6,10]
>>> w2 = ((2 * x) for x in w)
>>> for x in w2: print x
...
2
8
12
20

但是,当我尝试使用 continue 不打印 8 时,我得到一个空格作为输出。

>>> for x in w2:
... if x == 8: continue
... print x
...
>>>

我试图在第二次迭代中获得 2, 12, 20 的输出。如何获得所需的输出?

最佳答案

生成器与列表不同,因为它在需要时生成元素,并且这些元素不会保存在内存中。一旦你遍历完所有元素,当你尝试再次迭代它们时,生成器将不会打印任何内容,因为它已经被使用过。

很可能您已经在第一个 for 循环中消耗了生成器,因此当您尝试再次迭代它时,它是空的。尝试使用 print list(w2) 而不是循环来检查元素是否存在。

示例

让我们定义一个函数,打印从可迭代对象到值的元素:

def printuntil(iterable, stopval):
for item in iterable:
print item
if item == stopval:
break

现在让我们用列表尝试两次:

>>> vals = [2 * x for x in range(3)]
>>> printuntil(vals, 2)
0
2
>>> printuntil(vals, 4)
0
2
4

一切看起来都不错,让我们用生成器做同样的事情:

>>> vals = (2 * x for x in range(3))
>>> printuntil(vals, 2)
0
2
>>> printuntil(vals, 4)
4

正如您所看到的,数字 02 已被消耗,因此第二次调用会打印第一个调用中尚未消耗的元素:4.因此,如果您想多次迭代一个可迭代对象,请使用列表。

复制生成器

您可以在使用生成器之前使用 itertools.tee 复制它。 ,因此您将受益于不将元素保存在列表中。

>>> vals = (2 * x for x in range(5))
>>> from itertools import tee
>>> vals, valscopy = tee(vals)
>>> printuntil(vals, 2)
0
2
>>> printuntil(valscopy, 4)
0
2
4

这将节省内存,但不提高性能,因为必须始终生成元素。

关于python - 在生成器上使用 continue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25461849/

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