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

为何判断闰年的Python条件语句需按特定顺序编写?

闰年判断函数的逻辑问题解析

我正在学习Python,做一道闰年判断测验题:要求根据公历规则判断给定年份是否为闰年,返回布尔值True或False。但我写的函数无法让2100年返回正确结果False,对比正确代码后,想搞清楚几个问题:为何条件语句要按这个顺序排列?两段代码的差异是什么?条件语句的层级逻辑是怎样的?

我的代码

def is_leap(year):
    leap = False
    
    if year % 4 == 0:
        return True
    if year % 100 == 0:
        return True
    if year % 400 == 0:
        return leap
    
    #return leap

year = int(input())
print(is_leap(year))

正确代码

def is_leap(year):
    leap = False
    
    if year % 400 == 0:
        return True
    if year % 100 == 0:
        return leap
    if year % 4 == 0:
        return True
    
    return leap
    
year = int(input())
print(is_leap(year))

两段代码的核心差异

1. 条件判断顺序完全颠倒

我的代码先判断「能被4整除」,再判断「能被100整除」,最后判断「能被400整除」;正确代码则是先判断「能被400整除」,再判断「能被100整除」,最后判断「能被4整除」。

2. 条件逻辑完全错误

  • 我的代码中,只要年份能被4整除就直接返回True,像2100这种能被4和100整除但不能被400整除的年份,会直接触发第一个条件返回True,完全忽略了后续的闰年规则。
  • 我的代码把「能被100整除」的情况返回True,这和公历规则完全相反——能被100整除的年份不是闰年,除非它同时能被400整除。
  • 我的代码中「能被400整除」的条件返回初始值False,这完全搞反了逻辑,能被400整除的年份明明是闰年。

3. 返回语句缺失

我的代码注释掉了最后的return leap,不过因为前面的条件都提前返回了,这一点影响不大,但属于代码不规范。

条件语句的层级逻辑(公历闰年规则)

公历闰年的判断规则是有优先级的,必须按从特殊到一般的顺序判断:

  1. 最高优先级:能被400整除的年份是闰年(比如2000年),这是规则中的例外情况,必须先判断,避免被后面的条件覆盖。
  2. 次优先级:能被100整除但不能被400整除的年份不是闰年(比如2100年),在排除了能被400整除的情况后,只要能被100整除,直接返回False。
  3. 一般情况:能被4整除但不能被100整除的年份是闰年(比如2020年),前面已经排除了能被100整除的情况,所以只要满足能被4整除,就可以确定是闰年。
  4. 其他情况:都不满足的年份不是闰年,返回初始的False。

为什么顺序不能乱?

如果像我的代码那样先判断「能被4整除」,像2100这种符合「能被4整除」但不符合闰年规则的年份,会直接返回True,后面的「能被100整除」「能被400整除」的判断根本不会执行,自然得到错误结果。只有先处理最特殊的「能被400整除」,再处理「能被100整除」,最后处理一般情况,才能覆盖所有规则,得到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:51:22