Python编写质数查找函数时,逻辑判断输出异常,疑似OR被执行为AND
问题本质说明
这不是Python的运行bug,也不是跨版本、跨编辑器的环境异常,核心是对逻辑运算符的执行规则和自身筛选意图存在认知偏差。
逻辑判断的实际运行拆解
你当前代码里的核心判断条件为:if i % 2 != 0 or i % 3 != 0:
根据Python的逻辑运算规则:
- 由
or连接的表达式,仅当两个子条件同时为False时,整个表达式才会返回False(也就是不执行append操作,把当前数值筛掉) - 两个子条件同时为False的场景,等价于:
i % 2 != 0为False → i能被2整除i % 3 != 0为False → i能被3整除
- 两者同时满足的i,就是所有能被6整除的数,这和你实际运行看到的“只有6的倍数被剔除”的结果完全匹配。
筛选意图和逻辑修正
你最初的筛选目标是保留「既不是偶数、也不能被3整除」的数,这个场景下应该使用and连接两个判断条件,而非or,修正后的核心判断逻辑为:if i % 2 != 0 and i % 3 != 0:
我们可以通过几个典型数值的判断结果对比,直观看到两个连接符的差异:
- 数值2(能被2整除、不能被3整除):
- 用
or判断:False or True = True → 会被错误保留 - 用
and判断:False and True = False → 会被正确剔除
- 用
- 数值9(不能被2整除、能被3整除):
- 用
or判断:True or False = True → 会被错误保留 - 用
and判断:True and False = False → 会被正确剔除
- 用
- 数值6(既能被2整除、也能被3整除):
- 无论用
or还是and,判断结果都是False → 都会被剔除
- 无论用
关于你提到的“还原代码后异常”
逻辑判断的结果在所有Python 3.x版本、所有代码编辑器里的运行表现是完全一致的,不存在随机生效的bug,大概率是还原代码的过程中,手滑把原来的and连接符误写成了or。
最后补充:就算把连接符修正为and,这版代码也仅能完成最粗的初步筛选——筛完的结果里还会存在25、35、49这类能被5、7等质数整除的非质数,距离完成“找出所有小于等于给定值的质数”的作业目标,还需要补充更完善的整除判断逻辑。
内容的提问来源于stack exchange,提问作者Arturo Castillin
相关产品推荐
相关产品推荐

