
[英]Can I use if-else statement nested in for loop on an Array in Python
[英]how do I format a nested if-else statement in python to make it work?
我正在介绍编写脚本 class 并提示制作一个程序,该程序将接受输入月份,然后是 integer 日并告诉它属于哪个季节,或者如果输入不符合标准则写入“无效”( zybooks 实验室 3.12.1)。 我看过一些这样的例子,但是他们用不同的方式写的,我想学习这个,而不是复制已经解决的问题。 我定义了我的输入,列出了可接受的字符串输入以供检查,然后根据其中的天数进一步将列表分解为几个月。 我设置检查以确保输入的 int 值落在输入的月份范围内,如果通过检查则将该值设置为 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”下的第二个嵌套 function 不起作用。 如果我的输入是“March”和“35”,它会打印 Invalid。 如果我的输入是“March”和“11”,它会打印 Winter。 但出于某种原因,如果我输入“March”和“22”,它会打印 Winter,我不知道为什么在真正检查 input_day 和大于 20 的值后它不会继续到 else 条件。可以有人告诉我为什么吗? 我无法找到为什么这不会使 input_day <= 19 检查和打印“Spring”失败的答案。 此外,PyCharm 告诉我可以简化“if input_day == True”的行,但没有告诉我如何简化。 谢谢。
因此,据我所知,您在处理 3 月支票下的内容以及为什么它认为 22 小于或等于 19 时遇到了问题。
好吧,那是因为您检查了input_day
变量是否小于或等于 19,但是在检查之前您似乎也将其设置为 True,即 boolean 值。 bool 在 Python 中的工作方式是False
和True
关键字分别是整数0
和1
的占位符,并且看到这两个都小于 19 您的问题表面。
例子:
var = True
if var <= 1: # This will always trigger since var is technically equal to 1.
print("Here")
解决方法是在那里使用不同的变量。
关于 PyCharm 告诉你== True
部分可以简化,那只是因为if
命令通过检查条件是否为 True 来工作。 这意味着如果您的变量已经是 True 或 False,则无需检查它是否等于那个(即使这样做更直观),但这充其量只是一个吹毛求疵,最坏的情况是一种小浪费的时间。
但出于某种原因,如果我输入“March”和“22”,它会打印 Winter,我不知道为什么在真正检查 input_day 和大于 20 的值后它不会继续到 else 条件。可以有人告诉我为什么吗?
出现此行为的原因是,如果input_day
的 integer 值是 22,则用代码中的值True
覆盖它。 在 Python 中, True
等于1
(一),因此稍后在代码中1 <= 19
给出Winter
。
如果您检查当天的有效性,则将所有input_day
替换为day_OK
,您将获得预期的行为。
不要忘记先设置day_OK=False
,然后如果检查有效性设置day_OK=True
并使用:
if input_month == 'March':
if day_OK: # means the same as day_OK == True
if input_day <= 19:
print('Winter')
else:
print('Spring')
else:
print('Invalid')
但是......最好按照Barmar在对你的问题的评论中的建议重写你的代码。
重写后的样子如下:
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 month', input_month)
day_OK=False
if input_month in day30_months and 0 < input_day <= 30:
day_OK = True
elif input_month in day31_months and 0 < input_day <= 31:
day_OK = True
elif input_month in day29_months and 0 < input_day <= 29:
day_OK = True
else:
print('Invalid day for', input_month)
if day_OK and input_month == 'March':
if input_day <= 19:
print('Winter')
else:
print('Spring')
if day_OK and input_month in ('April', 'May'):
print('Spring')
改进代码的下一步可能是使用字典来表示一个月中的月份和日期,从而使代码更简单、更短:
dict_months = {
'January':31, 'February':29, 'March':31, 'April':30, 'May':31,
'June':30, 'July':31, 'August':31, 'September':30, 'October':31,
'November':30, 'December':31
}
month_OK=False
day_OK=False
input_month = input()
input_day = int(input())
if input_month in dict_months:
month_OK=True
else:
print('Invalid month', input_month)
if month_OK and 0 < input_day <= dict_months[input_month]:
day_OK = True
else:
print('Invalid day',input_day,'for', input_month)
if day_OK and input_month == 'March':
if input_day <= 19:
print('Winter')
else:
print('Spring')
if day_OK and input_month in ('April', 'May'):
print('Spring')
将字典值作为元组列出月份的天数和一年中给定月份之前的天数,就可以根据用户输入的年份确定将以下 if 条件削减为四年的四个季节的条件:
dict_months = {
'January':(31,0), 'February':(29,31), 'March':(31,60),
'April':(30,91), 'May':(31,121), 'June':(30,152),
'July':(31,182), 'August':(31,213), 'September':(30,244),
'October':(31,274), 'November':(30,305), 'December':(31,335)
}
month_OK=False
day_OK=False
input_month = input()
input_day = int(input())
if input_month in dict_months:
month_OK=True
else:
print('Invalid month', input_month)
if month_OK and 0 < input_day <= dict_months[input_month][0]:
day_OK = True
else:
print('Invalid day',input_day,'for', input_month)
if day_OK and month_OK:
day_of_year = dict_months[input_month][1]+input_day
if day_of_year <= 79 or day_of_year >= 356:
print('Winter')
if 80 <= day_of_year <= 172:
print('Spring')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.