HappyHands31 - 1 year ago 80
Python Question

# Determining leap years

We know it's a leap year if it's divisible by four and, if it's a century year, it's divisible by 400. I thought I would need two If Statements like this:

``````def isLeap(n):

if n % 100 == 0 and n % 400 == 0:
return True
if n % 4 == 0:
return True
else:
return False

# Below is a set of tests so you can check if the code is correct.

from test import testEqual

testEqual(isLeap(1944), True)
testEqual(isLeap(2011), False)
testEqual(isLeap(1986), False)
testEqual(isLeap(1956), True)
testEqual(isLeap(1957), False)
testEqual(isLeap(1800), False)
testEqual(isLeap(1900), False)
testEqual(isLeap(1600), True)
testEqual(isLeap(2056), True)
``````

When I tried the code above I got error messages for the years

``````1800 - Test Failed: expected False but got True
1900 - Test Failed: expected False but got True
``````

Basically I need my code to say that "the test is true if the year is divisible by four, and, if it's a century year, it's divisible by 400." But when I try:

``````if n % 4 and (n % 100 == 0 and n % 400 == 0):
return True
else:
return False
``````

I get three error messages (for the years)

``````1944 - Test Failed: expected True but got False
1956 - Test Failed: expected True but got False
2056 - Test Failed: expected True but got False
``````

So it looks like me creating the second condition (divisible by 100 and 400) has canceled out the years that are divisible by 4.

``````return (n % 100 != 0 and n % 4 == 0) or n % 400 == 0
``````>>> [(x % 100 != 0 and x % 4 == 0) or x % 400 == 0 for x in [1944, 1956, 2056, 1800, 1900]]