使用迭代器协议生成素数
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))
我正在尝试获取从 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))