Előző - #19 Jelszógenerátor | Tartalomjegyzék | Következő - #21 Érvényesítés dátuma
isLeapYear(2004) → Igaz
Körülbelül 365,25 nap kell ahhoz, hogy a Föld keringjen a Nap körül. Ez az enyhe eltolás azt eredményezné, hogy a 365 napos naptárunk idővel pontatlanná válna. Ezért a szökőéveknek van egy extra napja, február 29 . Szökőév minden néggyel osztható évben előfordul (pl. 2016, 2020, 2024 és így tovább). Ez alól a szabály alól azonban az a kivétel, hogy a százzal osztható évek (pl. 2100, 2200, 2300 és így tovább) nem szökőévek. És ez alól a kivétel az, hogy a négyszázzal osztható évek (pl. 2000, 2400 és így tovább) szökőévek.
Gyakorlat leírása
Írjon isLeapYear()függvényt egész yearparaméterrel. Ha year szökőév, akkor a függvény visszatér True. Ellenkező esetben a függvény visszatér False.
Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. A megoldás akkor helyes, ha a következő állítások feltételei teljesülnek True:
assert isLeapYear(1999) == Hamis
assert isLeapYear(2000) == Igaz
assert isLeapYear(2001) == Hamis
assert isLeapYear(2004) == Igaz
assert isLeapYear(2100) == False
assert isLeapYear(2400) == Igaz
Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.
Előfeltétel fogalmak: modulo operátor, elif utasítások
Megoldás tervezése
A szökőévek meghatározása magában foglalja annak ellenőrzését, hogy egy egész szám osztható-e 4-gyel, 100-zal és 400-zal. A 3. gyakorlat, a „Páratlan és páros”, az 5. gyakorlat, a „Füzérzés” és a 6. gyakorlat, a „Sorrendű utótag” megoldása a % modulo operátort az egész számok oszthatóságának meghatározásához. A megoldásunkban a % 4 , year % 100, és a % 400 évszámot fogjuk használni .
Az is segíthet, ha táblára vagy papírral és tollal megrajzol egy folyamatábrát az általános logikáról. Valahogy így nézhet ki:
A szökőévre vonatkozó szabályok néhány kivételt tartalmaznak, ezért ehhez a függvényhez szükség van egy sor if- elif- else utasításra. Ezen kijelentések sorrendje számít. Használhat egy ifutasítást annak ellenőrzésére, hogy az év osztható-e 4-gyel, és ha igen, adja vissza True. De mielőtt visszatérne, szüksége van egy másik ifutasításra, hogy ellenőrizze, hogy az év osztható-e 100-zal, és visszatérjen False. De előtte szükség van még egy olyan ifállításra, amely akkor tér vissza, Trueha az év osztható 400-zal. Ha így írunk kódot, a végeredmény így néz ki:
def isLeapYear(year):
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
# Year is divisible by 400:
return True
else:
# Year is divisible by 100 but not by 400:
return False
else:
# Year is divisible by 4 but not by 100:
return True
else:
# Year is not divisible by 4:
return False
This code works correctly but is hard to follow. There are several levels of indentation, and the nested if-else statements make it tricky to see which else statement is paired with which if statement.
Instead, try switching around the order of the logic. For example, if the year is divisible by 400, return True. Or else, if the year is divisible by 100, return False. Or else, if the year is divisible by 4, return True. Or else, for all other years return False. Writing code this way reduces the amount of nested if-else statements and produces more readable code.
Special Cases and Gotchas
Outside of the complex list of rules, there are no particular gotchas for this exercise. The tricky part is to ensure that you have the conditions for the if and elif statements in the correct order.
Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.
Solution Template
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/leapyear-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def isLeapYear(year):
# Years divisible by 400 are leap years:
if ____ % 400 == ____:
return ____
# Otherwise, years divisible by 100 are not leap years:
elif ____ % 100 == ____:
return ____
# Otherwise, years divisible by 4 are leap years:
elif ____ % 4 == ____:
return ____
# Otherwise, every other year is not a leap year:
else:
return ____
The complete solution for this exercise is given in Appendix A and https://invpy.com/leapyear.py. You can view each step of this program as it runs under a debugger at https://invpy.com/leapyear-debug/.
Prev - #19 Password Generator | Table of Contents | Next - #21 Validate Date