问题描述
为什么for循环中的if语句不能正常工作? “0,1”虽然小于2,但仍然返回True。代码有点草率,抱歉。
def isprim(n):
for i in range(2,n-1):
if n % i == 0 or n < 2:
return False
return True
for i in range(50):
if isprim(i):
print(i)
输出为:
0 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
解决方法
当n = 0
、n = 1
或n = 2
时,函数不执行循环,因为循环的range
从2开始,因此函数跳过循环并返回True
。
永远不会进入 isprim(n) 中的 for 循环,因为对于 range(2,n-1),2 大于 0 和 1。因此,对于这些情况,始终执行 return True。
,游戏:
- 从 0 到 49 循环
- 迭代 0 -> isprim(0)
- 从 2 到 -1 循环 -> range(2,-1) 是一个空列表
- 返回真
- 迭代 1 -> isprim(1)
- 从 2 到 0 循环 -> range(2,0) 是一个空列表
- 返回真
- 迭代 2 -> isprim(2)
- 从这里开始,n 总是大于或等于 2。
所以您的问题是 for i in range(2,n-1)
。在 REPL 中:
>>> len(range(2,-1))
0
>>> len(range(2,0))
0
>>> len(range(2,1))
0
>>> len(range(2,2))
0
>>> len(range(2,3))
1
对于最初的几个素数,最好进行显式测试:
def is_prime(n: int) -> bool:
if n not in [1,2]:
for i in range(2,n-1):
return False
return True
,
这可能就是你要找的
def isprim(n):
for i in range(2,n):
if n % i == 0 or n < 2:
return False
else:
return True
# Special case for 2
if n==2:
return True