Python 素数迭代器

Python 素数迭代器,python,iterator,Python,Iterator,我写了一段代码来打印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

我写了一段代码来打印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作为输出。我试着让这门课变得轻松愉快。代码如下。但是输出是01 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,

您的问题是在测试代码中重用变量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,

您的问题是在测试代码中重用变量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,

您正在使用此代码打印值:

for p in range (5):
    print p,
如果你看这个,它会打印范围的值。您可能希望打印来自主迭代器的内容。具有一些可能有帮助的功能:

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

您正在使用此代码打印值:

for p in range (5):
    print p,
如果你看这个,它会打印范围的值。您可能希望打印来自主迭代器的内容。具有一些可能有帮助的功能:

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

生成最大值为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=' ')

生成最大值为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=' ')

nextmethod已被弃用,您甚至没有使用您创建的类。只需使用Range,非常感谢您的回答!愚蠢的疏忽。。。我已经调试了一段时间了!!这是一种生成素数的非常慢的方法。如果你的素数有一个上限,那么Erastothenes筛的性能会更好。@misha:谢谢。我只是尝试一些例子来学习迭代器!生成素数不是我的意图下一种方法已被弃用,您甚至没有使用您创建的类。只需使用Range,非常感谢您的回答!愚蠢的疏忽。。。我已经调试了一段时间了!!这是一种生成素数的非常慢的方法。如果你的素数有一个上限,那么Erastothenes筛的性能会更好。@misha:谢谢。我只是尝试一些例子来学习迭代器!生成素数并不是我的意图,这正是我要建议的+1您的X范围格式不正确,部分内容当前显示为注释。我想自己编辑,但出于某种原因,编辑必须是6个字符或更多。@Symmetric:Python注释以开头。//在Python中是显式整数除法。语法highlighter不能将其识别为Python.Aha,这是有道理的。我不知道“/”操作符。谢谢。正是我要建议的+1您的X范围格式不正确,部分内容当前显示为注释。我想自己编辑,但出于某种原因,编辑必须是6个字符或更多。@Symmetric:Python注释以开头。//在Python中是显式整数除法。语法highlighter不能将其识别为Python.Aha,这是有道理的。我不知道“/”操作符。谢谢