Python中两段偶数判断代码对0的判定结果不一致的原因
差异原因核心结论
两段代码结果不一致,既不是Python对偶数的判定出错,也不是0的数学属性有问题,本质是filter()函数的筛选规则,和第一个判断函数的返回值逻辑共同导致的。
底层运行逻辑拆解
先搞懂filter()的筛选规则
Python内置的filter(判断函数, 待遍历序列)工作逻辑非常直接:
- 逐个把序列里的元素传入判断函数拿到返回值
- 只判断返回值的布尔真假:返回值为真(truthy)就保留对应元素,返回值为假(falsy)就过滤掉对应元素,完全不关心返回值的具体内容。
Python中默认判定为假(falsy)的值包括:None、False、数值0、空字符串、空列表、空元组、空字典等,其余值默认都判定为真(truthy)。
示例1丢失0的具体逻辑
示例1的判断函数代码如下:
def check_even(num): if num%2==0: return num
逐个传入nums里的元素时,返回值分别是:
- 传入奇数:
num%2 == 0条件不成立,函数没有写显式返回值,Python默认返回None,属于falsy值,奇数被正常过滤。 - 传入2、4、6、8、10这类非0偶数:条件成立,返回对应的num值,这些都是非0整数,属于truthy值,因此被正常保留。
- 传入0:
0%2 == 0条件是成立的,函数触发返回逻辑,返回值是0——而0刚好属于falsy值,filter拿到返回值0后判定为假,直接把0过滤掉了,最终结果就缺了0。
示例2正常返回0的具体逻辑
示例2的判断函数代码如下:
def check_even(num): return num%2==0
这个函数不管传入什么值,返回的都是明确的布尔比较结果:
- 传入奇数:
num%2 == 0结果为False,属于falsy值,奇数被过滤。 - 传入所有偶数(包括0):
num%2 == 0结果为True,属于truthy值,所有偶数都被保留,因此结果包含0,符合预期。
写
filter的判定函数时,建议始终返回明确的布尔比较结果,不要直接返回元素本身,否则很容易把0、空容器这类本身是falsy值的合法元素误过滤。
内容的提问来源于stack exchange,提问作者Yanji Lama
相关产品推荐
相关产品推荐

