繁体   English   中英

如何在 python 中格式化嵌套的 if-else 语句以使其工作?

[英]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 中的工作方式是FalseTrue关键字分别是整数01的占位符,并且看到这两个都小于 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM