Python北半球季节判断代码同时输出季节与Invalid的修正求助
问题:如何修正日期季节判断代码的重复输出问题
我写的日期季节判断代码,部分用例会同时输出季节和Invalid,比如输入April 11会输出Spring+Invalid,请问怎么改才能得到正确输出?
题目要求:编写程序,输入日期(月份字符串与日期整数),输出北半球对应季节,同时校验输入是否为真实有效的月份与日期。北半球季节划分:春季3月20日-6月20日,夏季6月21日-9月21日,秋季9月22日-12月20日,冬季12月21日-次年3月19日。示例:输入April 11输出Spring;输入Blue 65输出Invalid。
原代码
input_month = input() input_day = int(input()) if input_month == ('April' or 'May') and 1<= input_day <=31: print('Spring') if input_month == ('March') and 20<= input_day <= 31: print('Spring') if input_month == ('June') and 1<= input_day <= 20: print('Spring') if input_month == ('July' or 'August') and 1<= input_day <=31: print('Summer') if input_month == ('June') and 20<= input_day <= 30: print('Summer') if input_month == ('September') and 1<= input_day <= 21: print('Summer') if input_month == ('October') and 1<= input_day <= 31: print('Autumn') if input_month == ('November') and 1<= input_day <=31: print('Autumn') if input_month == ('September') and 22<= input_day <= 30: print('Autumn') if input_month == ('December') and 1<= input_day <= 20: print('Autumn') if input_month == ('January') and 1<= input_day <= 31: print('Winter') if input_month == ('February') and 1<= input_day <= 28: print('Winter') if input_month == ('December') and 21<= input_day <= 31: print('Winter') if input_month == ('March') and 1 <=input_day <= 19: print('Winter') else: print('Invalid')
测试结果
总得分: 6 / 10 1: 输出对比 0 / 1 输出不一致,查看高亮部分。 特殊字符说明 输入 April 11 你的输出 Spring Invalid 预期输出 Spring 2: 输出对比 1 / 1 输入 March 3 你的输出 Winter 3: 输出对比 1 / 1 输入 Word 21 你的输出 Invalid 4: 输出对比 1 / 1 输入 February 39 你的输出 Invalid 5: 输出对比 0 / 1 输出不一致,查看高亮部分。 特殊字符说明 输入 June 21 你的输出 Summer Invalid 预期输出 Summer 6: 输出对比 0 / 1 输出不一致,查看高亮部分。 特殊字符说明 输入 November 7 你的输出 Autumn Invalid 预期输出 Autumn 7: 输出对比 1 / 1 输入 September 31 你的输出 Invalid 8: 输出对比 1 / 1 输入 December -1 你的输出 Invalid 9: 输出对比 1 / 1 输入 February 0 你的输出 Invalid 10: 输出对比 0 / 1 输出不一致,查看高亮部分。 特殊字符说明 输入 October 31 你的输出 Autumn Invalid 预期输出 Autumn
问题根源
- else分支绑定错误:最后一个
else仅与紧邻的if(即判断3月1-19日为冬季的语句)绑定,而非所有季节判断逻辑。只要该if不成立,无论前面是否输出了季节,都会执行else打印Invalid。 - 月份判断逻辑错误:
input_month == ('April' or 'May')写法无效,('April' or 'May')会返回第一个真值'April',导致May无法被识别。 - 日期校验不完整:未先校验月份是否合法,也未针对不同月份的最大日期做精准校验(比如April、June只有30天)。
修改后的代码
input_month = input().strip() try: input_day = int(input().strip()) except ValueError: print('Invalid') exit() # 定义合法月份及其对应最大天数 valid_months = { 'January':31, 'February':28, 'March':31, 'April':30, 'May':31, 'June':30, 'July':31, 'August':31, 'September':30, 'October':31, 'November':30, 'December':31 } # 先校验输入合法性 if input_month not in valid_months or not (1 <= input_day <= valid_months[input_month]): print('Invalid') else: # 判断季节 if (input_month == 'March' and input_day >=20) or \ input_month in ['April', 'May'] or \ (input_month == 'June' and input_day <=20): print('Spring') elif (input_month == 'June' and input_day >=21) or \ input_month in ['July', 'August'] or \ (input_month == 'September' and input_day <=21): print('Summer') elif (input_month == 'September' and input_day >=22) or \ input_month in ['October', 'November'] or \ (input_month == 'December' and input_day <=20): print('Autumn') else: # 剩余合法日期均为冬季 print('Winter')
修改说明
- 异常处理:加入
try-except捕获日期输入非整数的情况,直接输出Invalid并退出。 - 合法月份字典:用字典存储所有合法月份及对应最大天数,快速校验月份和日期有效性。
- 前置合法性校验:先判断月份是否合法、日期是否在对应月份范围内,不合法直接输出Invalid。
- 季节判断优化:用
elif替代独立if,确保仅输出一个季节;修正月份判断逻辑为input_month in ['April', 'May'],整合季节条件让逻辑更清晰。 - else绑定正确:季节判断的
elif链最后用else处理冬季情况,确保所有合法日期都进入对应季节分支,不会触发多余的Invalid输出。
内容的提问来源于stack exchange,提问作者reliant
相关产品推荐
相关产品推荐

