You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何筛选非3、5倍数时,for循环用and、while循环用or结果一致?

为什么while循环和for循环的逻辑运算符看起来不一样?

我正在练习编写循环,遇到一道练习题:打印0到20中不能被3或5整除的数。我编写的while循环代码如下:

#solution with while
i = 0
while i < 21:
    i += 1
    if i % 3 == 0 or i % 5 == 0:
        continue
    print(i)

而编写for...in循环时,我发现必须使用and而非or才能得到正确结果,代码如下:

#solution with for
for k in range(21):
    if k % 3 != 0 and k % 5 != 0:
        print(k)

我困惑为何要更换逻辑运算符?在我看来两段代码都是遍历0到20的数字,条件判断应该一致,请问我忽略了什么?


这两个逻辑其实是等价的,核心是德摩根定律:对“或”命题取反,等于对每个命题取反后再“且”。

拆解来看:

  • 你的需求是打印「不能被3或5整除」的数,换个严谨的说法就是「既不能被3整除,也不能被5整除」。
  • while循环用的是排除法:先判断当前数是否能被3或5整除,如果是就跳过(continue),剩下的自然就是符合要求的数。
  • for循环用的是直接筛选法:直接判断当前数是否既不能被3整除,也不能被5整除,符合条件就打印。

用逻辑符号简化:
设A = 能被3整除,B = 能被5整除
需求是打印满足 ¬(A∨B) 的数(即“不是A或B”的情况)
根据德摩根定律,¬(A∨B) 完全等价于 ¬A ∧ ¬B(即“不是A,并且不是B”)

所以while循环里的if A∨B: continue,和for循环里的if ¬A ∧ ¬B: print,逻辑本质是一回事,只是处理方式不同,才导致运算符看起来不一样。

另外要注意:你的while循环其实没有处理数字0——初始i=0,进入循环后先执行i+=1,第一个处理的数是1,最后i=21时退出循环,所以0根本没被遍历到;而for循环的range(21)会覆盖0到20的所有数字,这是两段代码的另一个小差异,但和运算符无关。


内容的提问来源于stack exchange,提问作者user18377332

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:30:59