0

我试图得到一系列从 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

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

4

2 回答 2

2

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

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是五,那么下一个素数是七。current递增到六,然后它找到下一个素数,它也是七。

删除递增的语句current。然后添加一条语句以在找到下一个素数时进行更新。 current

...
    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

  • 打印相关数据/比较/...可能是一个有用的工具。
  • 用铅笔和纸单步执行代码也很有用 - Be The Interpreter
  • 如果您使用的是 IDE,那么学习它的调试功能应该是优先级列表中的重中之重。
于 2020-08-22T15:22:56.007 回答
0

试试这个

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))
于 2020-08-22T15:30:16.103 回答