Tisk kalendáře (pokračování)
Řešení
Možné řešení úlohy na tisk měsíčního kalendáře naleznete v souboru kalendar.py.
V souladu s doporučeným postupem se skládá z požadované funkce tisk_kalendare
a několika pomocných funkcí: jul_datum
a prestupny_rok
známe již z předchozích hodin, dni_mesice
vrací počet dní konkrétního měsíce (uvažuje i únor přestupných let), jmeno_mesice
vrací řetězec s českým jménem měsíce určeného číselným parametrem a konečně
tisk_dne
zabezpečuje správně formátovaný výstup jednoho dne do kalendáře (včetně přeskočení dní předchozího měsíce na začátku prvního týdne měsíce).
S využitím těchto pomocných funkcí pak funkce tisk_kalendare
je poměrně krátká a srozumitelná, přičemž (alespoň některé) vedlejší funkce by mohly nalézt uplatnění i při řešení jiných úloh. V závěru souboru je velmi krátký hlavní program, jehož pomocí je možné otestovat správnost řešení.
Vytvoření modulu
S významem a použitím modulů v Pythonu jsme se již dříve seznámili. Nyní si ukážeme, jak vytvořit vlastní modul s kalendářními funkcemi.
Z hlediska Pythonu je každý zdrojový soubor s příponou .py
modulem, jméno modulu je jméno souboru bez přípony, tj. v našem případě máme modul se jménem kalendar
. Z toho také vyplývá, že je výhodné vytvářet jméno souboru jako platný identifikátor. Za vhodné názvy lze považovat např. kalendar
, kal_funkce
apod., jako příklady nevhodných jmen uvedeme 23_funkci
1), super funkce
2) nebo kalendarni-funkce
3).
Máme-li tedy modul, můžeme jej použít v nějakém jiném modulu nebo z interaktivního prostředí jazyka pomocí příkazu import
. V dokumentaci jazyka je přesně popsáno, které adresáře se při hledání modulů procházejí. My se v tuto chvíli spokojíme s konstatováním, že stačí, aby vkládaný modul byl ve stejném adresáři jako program, ze kterého je importován (případně v aktuálním pracovním adresáři).
Sledujme nyní, co se stane, když v interaktivním prostředí importujeme náš modul.
>>> import kalendar
Vidíme, že dojde ke spuštění hlavního programu v souboru kalendar.py
. Pokud vložíme měsíc a rok, je na terminál vypsán kalendář pro uvedený měsíc. Můžeme si ověřit, že došlo k vložení modulu a jeho funkcí - můžeme je volat pomocí tečkové notace (modul.funkce
).
>>> kalendar.prestupny_rok(2012) True >>> kalendar.jmeno_mesice(6) 'červen' >>> print('JDN(1.1.2000) =', kalendar.jul_datum(1, 1, 2000)) JDN(1.1.2000) = 2451545
Při pokusu o opakované vložení modulu již ke spuštění hlavního programu modulu nedojde (Python pozná, že požadovaný modul je již vložen a příkaz ignoruje). Při vložení modulu do jiného programu je chování stejné.
Vytvořili jsme tedy vlastní modul s několika funkcemi, které lze použít i v jiných programech, ale pravděpodobně nám nevyhovuje skutečnost, že po vložení modulu dojde automaticky ke spuštění hlavního programu v modulu.
Jednou možností řešení je hlavní program z modulu kalendar
vymazat. Pak při importu k žádné viditelné činnosti nedojde a následně můžeme využívat všechny funkce v modulu implementované.
Na druhé straně mít nějaký hlavní program v modulu se často ukazuje jako výhodné pro testovací účely při pozdějších úpravách funkcí v modulu (rozšiřování, opravy chyb aj.). I pro tuto situaci nabízí Python uspokojivou cestu. Pro každý modul vytváří Python vestavěnou řetězcovou proměnnou __name__
4). V hlavním modulu je toto jméno nastaveno na řetězec "__main__"
, ve vložených modulech přímo na jméno modulu (např. "kalendar"
). To nám dává možnost vložit hlavní program v modulu do podmíněného bloku:
# hlavní program if __name__ == '__main__': mesic = int(input('Zadej měsíc: ')) rok = int(input('Zadej rok: ')) tisk_kalendare(mesic, rok)
Pokud spustíme přímo program zapsaný v souboru kalendar.py
, příkazy v podmíněném bloku se vykonají. Pokud je ale modul kalendar
vložen do jiného programu, pak podmínka je vyhodnocena jako False
a podmíněný blok je přeskočen. To znamená, že hlavní program vloženého modulu pak efektivně nevykoná žádnou činnost.
Tím jsme odstranili poslední překážku a upravený modul s kalendářními funkcemi můžeme používat samostatně i jako součást větších programů.
Moduly a funkce jsou efektivní prostředky, které usnadňují práci na rozsáhlejších programech. Pomáhají udržet kód přehledný, jeho jednotlivé menší části jsou snáze srozumitelné, lze je lépe a důkladněji testovat, je možné v nich později rychleji hledat a opravovat chyby či v případě potřeby je upravovat a doplňovat. Umožňují také spolupráci více programátorů.
Možná to ještě plně nedoceňujete, ale svůj význam rozhodně mají dokumentační řetězce funkcí, vhodné komentáře, přiléhavé pojmenování proměnných a funkcí i jasný a přehledný programátorský styl. Samozřejmě tyto záležitosti stojí trochu času a úsilí, ale mnohonásobně se vám vrátí, pokud se s nějakým časovým odstupem musíte ke svému (nebo cizímu) kódu vrátit a porozumět mu!