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

为何闰年判断程序的while循环无法正常终止?输入校验异常求助

闰年判断程序的两处异常修复

问题1:初始输入不合法后,后续正确输入仍无法退出循环

核心原因有两个:

  • 每次重新输入year后,未更新用于校验的pear变量,循环始终基于初始的pear值判断,导致正确输入无法被识别
  • 代码中所有valid == True都是相等比较操作,不是赋值,这会让valid始终保持False,循环无法终止

问题2:校验通过后逻辑错误(含崩溃风险)

原代码用index("0")和rindex("0")判断整百年的逻辑完全错误:

  • 若年份不含0(比如1996),sem.index("0")会直接抛出异常,导致程序崩溃
  • 整百年的判断逻辑不符合闰年规则,会出现误判

修正后的完整代码

print("Did you know that the last leap year was in 2020?")
print("To find out if a year is a leap year, use this program")
valid = False

while not valid:
    year = input("Please enter a year\n")
    pear = str(year)
    # 存在性检查
    if pear == "":
        print("Error. Please enter a year - it should be 4 digits long.")
    # 类型检查
    elif not pear.isnumeric():
        print("Error. Please enter a year - it should be 4 digits long.")
    # 长度检查
    elif len(pear) != 4:
        print("Error. Please enter a year - it should be 4 digits long.")
    else:
        year_int = int(year)
        # 标准闰年规则:能被4整除但不能被100整除,或者能被400整除
        if (year_int % 4 == 0 and year_int % 100 != 0) or (year_int % 400 == 0):
            print(f"{year_int} is a leap year")
        else:
            print(f"{year_int} is not a leap year")
        # 赋值标记校验通过,终止循环
        valid = True
print("Nice")

关键修复说明

  • 将输入操作移到循环内部,每次循环重新获取输入并更新pear,确保校验基于最新输入
  • 把valid == True改为valid = True,完成赋值操作,让循环能正常退出
  • 替换错误的闰年判断逻辑,使用行业标准规则,避免异常和误判
  • 用elif替代嵌套if,简化代码结构,提升可读性

内容的提问来源于stack exchange,提问作者Azalea-Delphinium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:27:41