Python:检查gen中是否存在对象

2024-04-29 09:30:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个错误,这是由于检查“如果x在生成器中”的结果发生变化而引起的

def primes(upper_limit):
    for n in range(2, upper_limit):
        if all(n % i > 0 for i in range(2, n)):
            yield n

first_hundred_primes = primes(100)

print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
print(5 in first_hundred_primes)
print(5 in first_hundred_primes)

这将产生以下输出:

^{pr2}$

我假设它不是用来检查生成器中是否存在一个对象,但是如果是这样的话,它为什么不抛出一些错误,为什么这样做呢?在

>>> hundred_generator = range(1,100)
>>> 50 in hundred_generator
True
>>> 50 in hundred_generator
True
>>> 50 in hundred_generator
True

我通常在检查发电机中是否有物体(以加快检查速度)之前,把发电机变成一个装置,这样就解决了问题,但我很想知道这是怎么回事?在


Tags: intrueforifdef错误rangegenerator
1条回答
网友
1楼 · 发布于 2024-04-29 09:30:37

当您迭代生成器的元素时,使用它们。在

试试这个:

len(list(first_hundred_primes)) > 0
=> True
len(list(first_hundred_primes)) > 0
=> False

也就是说,您在第一次使用in(它迭代它们)时就已经完成了对元素的消费,或者在列出所有元素,直到5时,生成器将不再生成5。第二次之后,它不会再产生任何东西。在

您的选择:

  1. 在使用生成器之前,请将其转换为列表(或集合):first_hundred_primes = list(first_hundred_primes)
  2. {cd3>创建一个新的}
  3. 使用^{}

编辑:

至于你关于range的问题:range不是生成器。在

在python2中,它只返回一个列表。没问题。在

在python3中,它返回一个类似于集合的特殊对象。它不必实际存储范围内的所有数字,它只是根据定义范围的规则实现列表操作。E、 g.len实现为stop-start。因为它代表一个集合,而不是一个生成器,所以您可以多次迭代它,而不必“消耗”元素。在

相关问题 更多 >