质数迭代器

1 投票
3 回答
8269 浏览
提问于 2025-04-17 02:58

我写了一段代码来打印前n个质数:

class PrimeGen:
    def __init__(self):
        self.current = 2
    def genPrime(self, num):
        for i in range(num):
            while 1:
                for j in range(2, self.current/2 + 1):
                    if self.current % j == 0:
                        self.current = self.current + 1
                        break
                else:
                    break
            print self.current,
            self.current = self.current + 1

if __name__ == '__main__':
    p = PrimeGen()
    p.genPrime(5)

这段代码运行得很好。我得到了输出2 3 5 7 11。我尝试让这个类变得可迭代,下面是我的代码。但输出却是0 1 2 3 4。我有点搞不清楚哪里出错了。希望能得到一些帮助。谢谢!

class PrimeIter:
    def __init__(self):
        self.current = 1

    def next(self):
        self.current = self.current + 1
        while 1:
            for i in range(2, self.current/2 + 1):
                if self.current % i == 0:
                    self.current = self.current + 1
                    break # Break current for loop
            else:
                break # Break the while loop and return
        return self.current

    def __iter__(self):
        return self

if __name__ == '__main__':
    p = PrimeIter()
    for p in range (5):
        print p,

3 个回答

1

这是一个用来生成所有小于或等于某个最大值m的质数的迭代器:

class PrimeIter: 
    def ___init__(self, m): 
       self.max = m

    def __iter__(self):
       self.n = 1
       return self

    def __next__(self):
        if self.n < self.max:
           self.n += 1
           i = 2
           while i < (self.n//2+1):
                if self.n % i == 0:
                   self.n = self.n+1
                   if self.n > self.max:
                       raise StopIteration
                   i = 1
                i += 1
           else:
                return self.n
       else:
            raise StopIteration

 p = PrimeIter (100)        
 for i in p:
     print(i, end=' ')
1

你的问题是你在测试代码中重复使用了变量 p

if __name__ == '__main__':
    p = PrimeIter() # first declaration of p
    for p in range (5): # second declaration of p
        print p,   # uses second declaration of p

我建议你使用 itertools.islice 来获取迭代器的前5个元素:

if __name__ == '__main__':
    p = PrimeIter()
    for x in itertools.islice(p, 5):
        print x,
4

你正在用这段代码来打印值:

for p in range (5):
    print p,

如果你看看这段代码,它是在打印一个范围内的值。你可能想要打印的是质数迭代器中的内容。itertools库里有一些函数可能会对你有帮助:

for prime in itertools.islice(p, 5):
    print prime,

另外,你可能还想考虑使用生成器:

def primes():
    current = 1
    while True:
        current += 1
        while True:
            for i in xrange(2, current // 2 + 1):
                if current % i == 0:
                    current += 1
                    break
            else:
                break
        yield current

撰写回答