Python 我如何解决这个问题,使其显示从特定截止日期开始的季节(每个季节后21日)

Python 我如何解决这个问题,使其显示从特定截止日期开始的季节(每个季节后21日),python,python-3.x,Python,Python 3.x,问题是如何修改代码,使其显示特定日期的正确季节(例如:它在12月19日显示冬季,而我告诉它在21日显示冬季)。 如果你想知道为什么你会看到这两次,那是因为我无意中在不同的帐户上发布了相同的问题 month = int(input("Enter a month: ")) day = int(input("Enter a day: ")) def season(month, day): if (month == 12 or 1 <= month

问题是如何修改代码,使其显示特定日期的正确季节(例如:它在12月19日显示冬季,而我告诉它在21日显示冬季)。 如果你想知道为什么你会看到这两次,那是因为我无意中在不同的帐户上发布了相同的问题

month = int(input("Enter a month: "))
day = int(input("Enter a day: "))

def season(month, day):
    if (month == 12 or 1 <= month <= 4):          #months
        return "winter"
    elif(4 <= month <= 5):
        return "spring"
    elif(6 <= month <= 9):
        return "summer"
    elif(9 <= month <= 12):
        return "fall" 

    if month % 3 == 0 and day >= 21:        #days
        if season == "winter":
            season = "spring"
        elif season == "spring":
            season = "summer"
        elif season == "summer":
            season = "fall"
        else:
            return "winter" 
month=int(输入(“输入月份:”)
day=int(输入(“输入一天:”)
def季节(月、日):

如果(month==12或1您的解决方案走上了正确的轨道。您可能会发现,一个适当的数据结构可以为我们做很多繁重的工作。此外,我看到了一些错误

  • if month%3
    语句只在
    else
    案例中返回
    。在其他案例中会发生什么情况?
    None
    被返回。我想您需要设置
    季节
    ,然后设置
    返回季节

  • 但是您只是使用函数
    seasure()
    重载了变量
    seasure

  • 我建议使用
    dict
    索引,由
    month
    day
    tuple
    索引。本质上,创建一个复合索引。这是有效的,因为
    tuple
    是不可变的,因此可以散列,因此可以用作
    dict
    和其他地方的键

    我还希望向您展示让计算机为您生成测试数据是多么容易,就像我在下面验证代码工作时所做的那样

    def season(month, day):
        SEASONS = {  # must be ordered descending like this
            (11, 21): "winter",
            (8, 21): "fall",
            (5, 21): "summer",
            (2, 21): "spring",
            (1, 1): "winter"
        }
        for k in SEASONS:
            if (month, day) >= k:
                return SEASONS[k]
    
    res = []
    for month in range(1, 13): # 1 through 12
        for day in range(1, 32): # 1 through 31
            result = season(month, day)
            res.append([month, day, result])
    
    from pprint import pprint
    pprint(res, width=120)
    
    输出:

    [[1, 1, 'winter'],
     [1, 2, 'winter'],
     [1, 3, 'winter'],
    ...
     [3, 19, 'winter'],
     [3, 20, 'winter'],
     [3, 21, 'spring'],
    ...
     [6, 20, 'spring'],
     [6, 21, 'summer'],
     [6, 22, 'summer'],
    ...
     [9, 20, 'summer'],
     [9, 21, 'fall'],
    ...
     [12, 20, 'fall'],
     [12, 21, 'winter'],
    ...
     [12, 30, 'winter'],
     [12, 31, 'winter']]
    

    据我所知,对于给定的日期和季节,您希望根据日历确定季节:

    春季:3月21日至6月20日

    夏季:6月21日至9月20日

    秋季:9月21日至12月20日

    冬季:12月21日至3月20日

    您的代码与此非常接近,但存在一些问题:

    • 你的if条件下的季节没有很好的定义
    • 在检查了几个月后,您返回了结果,因此没有考虑当天
    您的代码经过一些更改后:

    def season(month, day):
        res = ""
        if (1 <= month <= 3):  # months
            res = "winter"
        elif (4 <= month <= 6):
            res = "spring"
        elif (7 <= month <= 9):
            res = "summer"
        elif (10 <= month <= 12):
            res = "fall"
        if month % 3 == 0 and day >= 21:  # days
            if res == "winter":
                return "spring"
            elif res == "spring":
                return "summer"
            elif res == "summer":
                return "fall"
            else:
                return "winter"
        return res
    

    那么,你能链接到另一个问题吗?这样社区就可以继续讨论你的问题了?你认为
    return
    在做什么?(假设月份必须在1-12之间)哦,我是通过查看你的帖子历史发现的。这两个问题都是由同一个帐户提出的?看起来已经解决了。我遗漏了什么?修复代码的方法是编写一个调用
    seasure()的简单循环
    有365个不同的日期和打印。这将是一个简单的测试套件,我想这不仅可以解决您当前的问题,而且可以保证它在一年中的所有日子都能正常工作。我不确定在我的答案20分钟后到达的另一个答案是什么,我补充说您选择了该答案。我已经指出了您的两个错误和prOvide提供了一个解决方案。您需要调用此函数,并使用您的日期和月份,如答案中的主编辑部分所示
    month = int(input("Enter a month: "))
    day = int(input("Enter a day: "))
    print(season(month, day))