MENÜ

Honlap címe

Előző - #20 szökőév | Tartalomjegyzék | Következő - #22 Rock, Paper, Scissors

21. GYAKORLAT: A DÁTUM ÉRVÉNYESÍTÉSE

isValidDate(2005, 3, 29)  →  True
isValidDate(2005, 13, 32)  →  False

Egy dátumot három egész számmal ábrázolhat az év, a hónap és a nap vonatkozásában, de ez nem jelenti azt, hogy bármely egész szám érvényes dátumot jelent. Elvégre nincs az évnek 13. hónapja vagy egyetlen hónapnak sem 32. napja . Ezzel a gyakorlattal ellenőrizheti, hogy az év/hónap/nap kombináció érvényes-e, mivel a különböző hónapokban eltérő számú nap van. A 20. gyakorlathoz írt „Szökőév” megoldást fogja használni ennek a gyakorlatnak a megoldásaként, ezért fejezze be a 20. gyakorlatot, mielőtt megpróbálná ezt.

Gyakorlat leírása

Írjon függvényt , , és isValidDate()paraméterekkel . A függvénynek True értéket kell visszaadnia , ha az ezekhez a paraméterekhez megadott egész számok érvényes dátumot jelentenek. Ellenkező esetben a függvény visszatér . A hónapokat (január) és (december) egész számok jelölik , a napokat pedig legfeljebb , , , vagy 31 egész számok jelölik a hónaptól és évtől függően. A megoldásnak importálnia kell a leapyear.py programot a 20. gyakorlatból a funkciója érdekében , mivel február 29-e a szökőévek érvényes dátuma.yearmonthdayFalse1121282930isLeapYear()

Szeptember, április, június és november 30 napos. A többieknek 31, kivéve a februárt, amely 28 napos. Szökőévekben február 29 napból áll.

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 isValidDate(1999, 12, 31) == Igaz

assert isValidDate(2000, 2, 29) == Igaz

assert isValidDate(2001, 2, 29) == False

assert isValidDate(2029, 13, 1) == False

assert isValidDate(1000000, 1, 1) == Igaz

assert isValidDate(2015, 4, 31) == False

assert isValidDate(1970, 5, 99) == False

assert isValidDate(1981, 0, 3) == False

assert isValidDate(1666, 4, 0) == False

 

import dátum és idő

d = dátumidő.dátum(1970, 1, 1)

egynap = dátumidő.idődelta(napok=1)

i tartományban (1000000):

    assert isValidDate(d.év, d.hónap, d.nap) == Igaz

    d += egynapos

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: import utasítások, Boole-operátorok, láncoló operátorok, elif utasítások

Megoldás tervezése

Bármely egész szám érvényes értéke a year paraméternek, de át kell lépnünk a leapyear.isLeapYear()year függvényünkbe , ha a (február) értékre van állítva . Győződjön meg arról, hogy a program rendelkezik egy importálási leapyear utasítással, és hogy a leapyear.py fájl ugyanabban a mappában van, mint a megoldás fájlja.month2

Az 1-month től eltérő értékek érvénytelen dátumnak minősülnek . A Pythonban az operátorokat parancsikonként összeláncolhatja: a kifejezés megegyezik a kifejezéssel . Ezzel meghatározhatja, hogy az Ön és a nap paraméterei érvényes tartományon belül vannak-e.121 <= month <= 12(1 <= month) and (month <= 12)month

A napok száma egy hónapban a hónaptól függ:

  • Ha , , , vagy 11month ( szeptember , április, június és november ), a maximális értéke .946day30
  • Ha monthvan (február), akkor 2 a maximális értéke 28 (vagy ha a szökőév.isLeapYear(year) értéket adja vissza ).day29True
  • Ellenkező esetben a nap maximális értéke 31.

ifA 20. gyakorlat, a „Szökőév” megoldásához hasonlóan ez a megoldás is , elif, vagy más kijelentések sorozata .

Különleges esetek és Gotchák

A kód lehető legegyszerűsítése érdekében gondoljon át azokra az esetekre, amelyek miatt a függvény a lehető leghamarabb visszatérhet. Például, ha a hónap a 12-ig1 terjedő tartományon kívül esik , a függvény a következőt adja vissza . Nincs más körülmény, amelyet ellenőriznie kell; a függvény azonnal visszatérhet . Ha nem tér vissza, akkor feltételezheti, hogy a hónap a függvény többi részére érvényes értéket tartalmaz.FalseFalse

A másik azonnali ellenőrzés, ha leapyear.isLeapYear(year) visszatér Trueés monthvan, 2és a day is 29, a függvény azonnal visszatérhet True. Ha a függvény nem tért vissza Truea szökőnapra, akkor feltételezhető, hogy a szökőévek nem relevánsak a függvény kódjának többi része szempontjából.

Most próbáljon meg egy megoldást írni az előző szakaszok információi alapján. Ha továbbra is problémái vannak a gyakorlat megoldásával, olvassa el a Megoldássablon részt további tippekért.

Megoldás sablon

Próbáljon először megoldást írni a semmiből. De ha nehézségei vannak, akkor a következő részprogramot használhatja kiindulási helynek. Másolja ki a következő kódot a https://invpy.com/validatedate-template.py webhelyről , és illessze be a kódszerkesztőbe. Cserélje ki az aláhúzást kódra, hogy működő programot készítsen:

# Importálja a szökőév modult az isLeapYear() függvényéhez:

____ szökőév

 

def isValidDate(év, hónap, nap):

    # If month is outside the bounds of 1 to 12, return False:

    if not (1 ____ month ____ 12):

        return ____

    # After this point, you can assume the month is valid.

 

    # If the year is a leap year and the date is Feb 29th, it is valid:

    if leapyear.isLeapYear(____) and ____ == 2 and ____ == 29:

        return ____

    # After this point, you can assume the year is not a leap year.

 

    # Check for invalid dates in 31-day months:

    if month in (1, 3, 5, 7, 8, 10, 12) and not (1 <= ____ <= 31):

        return ____

    # Check for invalid dates in 30-day months:

    elif ____ in (4, 6, 9, 11) and not (1 <= day <= 30):

        return ____

    # Check for invalid dates in February:

    elif month == ____ and not (1 <= ____ <= 28):

        return ____

 

    # Date passes all checks and is valid, so return True:

    return ____

The complete solution for this exercise is given in Appendix A and https://invpy.com/validatedate.py. You can view each step of this program as it runs under a debugger at https://invpy.com/validatedate-debug/.

Further Reading

Python’s datetime module has several features for dealing with dates and calendar data. You can learn more about it in Chapter 17 of Automate the Boring Stuff with Python at https://automatetheboringstuff.com/2e/chapter17/.

Prev - #20 Leap Year | Table of Contents | Next - #22 Rock, Paper, Scissors

 

Asztali nézet