终端中的Python素数生成器

时间:2015-02-26 03:06:14

标签: python generator

我有这段代码:

# 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

我不知道这里发生了什么?作为旁注,我正在导入脚本(作为模块),如果它很重要的话。

1 个答案:

答案 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