使用迭代器协议生成素数

Generate Prime Numbers With Iterator Protocol

我正在尝试获取从 1 到 n 的一系列素数。我没有使用范围和 for 循环,而是尝试使用迭代器协议来实现它。到目前为止,我有以下内容,但如您所见,它并没有达到我的预期。

class Prime:
    def __init__(self, n):
        self.n = n
        self.current = 1
    def __iter__(self):
        return self
    def __next__(self):
        x = self.current
        self.current += 1
        for num in range(self.current, self.n):
            if num > 1:
                for i in range(2, num):
                    if num % i == 0:
                        break
                else:
                    return num


d = Prime(20)
c = iter(d)
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))

它打印 2,3,5,5,7,7 目标是打印 2,3,5,7,11...19

我只是不想回答,如果你也能解释一下,我将不胜感激。谢谢

当您在实例上调用 next 时,您会递增 current,这样您就可以从中断的地方开始。然后你继续 找到 下一个素数但不更新 current。如果在每次下一次调用时打印 current,您可以看到发生了什么。

print(f'current:{c.current} | next prime: {next(c)}')
print(f'current:{c.current} | next prime: {next(c)}')    
print(f'current:{c.current} | next prime: {next(c)}')
print(f'current:{c.current} | next prime: {next(c)}')
print(f'current:{c.current} | next prime: {next(c)}')    # current:5 | next prime: 7
print(f'current:{c.current} | next prime: {next(c)}')    # current:6 | next prime: 7
print(f'current:{c.current} | next prime: {next(c)}')    # current:7 | next prime: 11
print(f'current:{c.current} | next prime: {next(c)}')    # current:8 | next prime: 11
print(f'current:{c.current} | next prime: {next(c)}')

...

例如,如果 current 是 5,那么下一个质数是 7。 current 增加到 6,然后它找到 下一个 素数,它也是 7。

删除增加 current 的语句。然后在找到next素数时添加语句updatecurrent

...
    def __next__(self):
        x = self.current
##        self.current += 1
        for num in range(self.current, self.n):
            if num > 1:
                for i in range(2, num):
                    if num % i == 0:
                        break
                else:
                    self.current = num + 1 
                    return num

  • 打印相关 data/comparisons/... 可能是一个有用的工具。
  • 用铅笔和纸逐步完成代码也很有用 - 成为解释者
  • 如果您使用的是 IDE,学习其调试功能应该是优先事项。

试试这个

class Prime:
    def __init__(self, n):
        self.n = n
        self.current = 2
    def __iter__(self):
        for i in range(self.current, self.n+1):
            pflag = True
            for j in range(2, i):
                if i%j == 0:
                    pflag=False
                    break
                    
            if pflag:
                self.current=i
                yield i
d = Prime(20)
c = iter(d)
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))