为何筛选非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
相关产品推荐
相关产品推荐

