Python:检查给定的年份是否是闰年?

slsn1g29  于 2022-11-19  发布在  Python
关注(0)|答案(3)|浏览(142)

我想创建一个python程序与用户定义的函数,它应该读取一个由用户输入的年份,并通过检查输入的年份是否是闰年返回真/假。
这是我试过的

def is_leap(year):
    leap = False
    if(year%4==0):
        if(year%100!=0):
            if(year%400==0):
                leap= True
            else:
                leap= False
        else:
            leap= False
                
    else:
        leap= False
    
    return leap

year = int(input())
print(is_leap(year))

而且我没有得到所需的输出。
我用以下两个输入尝试了这段代码

2024

输出为

False

还有

2023

输出为

False

我错过了什么?

iih3973s

iih3973s1#

首先处理异常会产生更清晰的代码。

def is_leap(year):
    if year % 400 == 0:
        return True  # an exception to the century rule
    if year % 100 == 0:
        return False  # centuries aren't leap years
    return year % 4 == 0
xxhby3vn

xxhby3vn2#

让我们来看看你的2024年代码:

  • year%4==0为True,因此我们进入if块
  • year%100!=0也为True,因此我们再次进入if块。

现在你检查year%400==0。嗯,为什么?2024不是一个世纪,所以它永远不可能是400的倍数。所以你的逻辑在这里被打破了。2024可以被4整除,但不能被100整除。现在我们可以简单地返回True!
在下一个案例中,我们需要检查是否可被400整除(其中year%100!=0为False)。
如果我们把这些都取出来,我们会得到这个代码:

def is_leap(year):
    if(year%4==0):
        if(year%100!=0):
            return True
        else:
            if(year%400==0):
                return True
            else:
                return False
    else:
        return False

(note我如何去掉完全不必要的变量。)

izj3ouym

izj3ouym3#

通过嵌套if/else,您可以充当AND,而需要OR。
最好的方法是重构代码:

def is_leap(year):
    if (year%4==0) and (year%100!=0) or (year%400==0):
        return True
    return False

相当于:

def is_leap(year):
    return (year%4==0) and (year%100!=0) or (year%400==0)

测试项目:

assert not is_leap(1700)
assert not is_leap(1800)
assert not is_leap(1900)
assert not is_leap(2023)
assert is_leap(1600)
assert is_leap(2000)

相关问题