我有一个错误,这是由于检查“如果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
我通常在检查发电机中是否有物体(以加快检查速度)之前,把发电机变成一个装置,这样就解决了问题,但我很想知道这是怎么回事?在
当您迭代生成器的元素时,使用它们。在
试试这个:
也就是说,您在第一次使用
in
(它迭代它们)时就已经完成了对元素的消费,或者在列出所有元素,直到5时,生成器将不再生成5。第二次之后,它不会再产生任何东西。在您的选择:
first_hundred_primes = list(first_hundred_primes)
编辑:
至于你关于
range
的问题:range
不是生成器。在在python2中,它只返回一个列表。没问题。在
在python3中,它返回一个类似于集合的特殊对象。它不必实际存储范围内的所有数字,它只是根据定义范围的规则实现列表操作。E、 g.
len
实现为stop-start
。因为它代表一个集合,而不是一个生成器,所以您可以多次迭代它,而不必“消耗”元素。在相关问题 更多 >
编程相关推荐