我有这段代码:
# Developing a program to generate all prime numbers
def gen_primes():
n = 2
primes = set()
while True:
for p in primes:
if n%p == 0:
break
else:
primes.add(n)
yield n
n += 1
我可能会离开,但我假设gen_primes()。next()以2开头,然后继续前进到下一个素数3,依此类推,直到时间结束。然而,当我在终端中访问这些值时,他们根本不会这样做。
>>> for i in range(10):
... gen_primes().next()
...
2
2
2
2
2
2
2
2
2
2
和
>>> gen_primes().next()
2
>>> gen_primes().next()
2
>>> gen_primes().next()
2
>>> gen_primes().next()
2
我不知道这里发生了什么?作为旁注,我正在导入脚本(作为模块),如果它很重要的话。
答案 0 :(得分:4)
gen_primes()
每次都会创建一个新的生成器对象。相反,将其存储在变量中并使用next
,就像这样
>>> primes = gen_primes()
>>> for _ in range(10):
... next(primes)
...
...
2
3
5
7
11
13
17
19
23
29
而不是迭代迭代,而是将其留给内置的itertools.islice
模块,就像这样
>>> from itertools import islice
>>> for prime in islice(gen_primes(), 10):
... print(prime)
...
...
2
3
5
7
11
13
17
19
23
29