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
相关产品推荐
相关产品推荐

