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

Python季节判断程序嵌套if-else逻辑异常及代码简化求助

问题:季节判断程序的逻辑错误与代码优化疑问

我正在学习脚本入门课程,需要完成zybooks实验3.12.1:编写程序接收月份输入和整数日期输入,判断所属季节,不符合条件则输出Invalid。我没有照搬现有解法,而是自行定义输入、按天数分类月份,检查日期合法后将input_day设为True。相关代码如下:

input_month = input()
input_day = int(input())

months_list = [
    'January', 'February',
    'March', 'April', 'May',
    'June', 'July', 'August',
    'September', 'October',
    'November', 'December']

day30_months = (months_list[3], months_list[5], months_list[8], months_list[10])
day31_months = (months_list[0], months_list[2], months_list[4], months_list[6], months_list[7],
                months_list[9], months_list[11])
day29_months = (months_list[1])

if input_month not in months_list:
    print('Invalid')

if input_month in day30_months and 0 < input_day <= 30:
    input_day = True

if input_month in day31_months and 0 < input_day <= 33:
    input_day = True

if input_month in day29_months and 0 <= input_day <= 29:
    input_day = True

if input_month == 'March':
    if input_day == True:
        if input_day <= 19:
            print('Winter')
        else:
            print('Spring')
    else:
        print('Invalid')

if input_month in ('April', 'May'):
    if input_day == True:
        print('Spring')
    else:
        print('Invalid')

目前大部分功能正常,但处理March的嵌套逻辑存在问题:输入March和35会输出Invalid,输入March和11会输出Winter,但输入March和22却仍输出Winter,无法进入else分支输出Spring,不知原因。另外PyCharm提示“if input_day == True”可简化,但我不知道如何操作,恳请解答。


问题分析与解决

1. March日期判断错误的核心原因

你在验证日期合法性后,把原本是整数类型的input_day直接赋值成了布尔值True。之后判断input_day <=19时,Python会把布尔值True当作整数1处理,1 <=19永远成立,所以不管输入的日期是22还是其他大于19的数,都会进入Winter分支。

解决方法:不要修改原始的input_day变量,新增一个布尔变量专门标记日期是否合法,比如is_valid_day:

# 新增变量标记日期合法性,初始为False
is_valid_day = False

# 各月份日期验证分支修改为更新is_valid_day
if input_month in day30_months and 0 < input_day <= 30:
    is_valid_day = True

# 这里你之前写错成<=33,31天的月份最多31天,修正为31
if input_month in day31_months and 0 < input_day <= 31:
    is_valid_day = True

# 日期不能为0,修正判断条件为1<=input_day<=29
if input_month in day29_months and 1 <= input_day <= 29:
    is_valid_day = True

# March的判断逻辑修改为使用is_valid_day
if input_month == 'March':
    if is_valid_day:
        if input_day <= 19:
            print('Winter')
        else:
            print('Spring')
    else:
        print('Invalid')

2. PyCharm提示的简化操作

当判断一个布尔变量是否为True时,不需要写if 变量 == True,直接写if 变量:即可;如果判断是否为False,则写if not 变量:。

比如原来的if input_day == True:,修改后可以直接写成if is_valid_day:,这样代码更简洁,符合Python的编码规范。

额外的细节修正

  • 你在day31_months的判断里写了<=33,这是明显错误,31天的月份最多只有31天,必须改成<=31。
  • day29_months的判断里包含了0 <= input_day,但日期没有0号,应该改成1 <= input_day <=29。
  • 当input_month not in months_list时,打印Invalid后代码还会继续执行,可能导致重复输出或逻辑混乱,建议在打印后加上exit()终止程序,或者用else分支控制后续代码的执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:55:29