为什么 if 语句中的“或”运算符不起作用?

问题描述

为什么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 = 0n = 1n = 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