Uživatelské nástroje

Nástroje pro tento web


prog:kalendar2

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_funkci1), super funkce2) nebo kalendarni-funkce3).

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!

1)
identifikátor nemůže začínat číslicí
2)
obsahuje mezeru
3)
znak - je interpretován jako aritmetický operátor
4)
Možná si pamatujete, že jsme v jedné z úvodních hodin doporučovali nepoužívat podtržítka na začátku jmen proměnných s tím, že jsou využívána pro vnitřní systémové účely.
prog/kalendar2.txt · Poslední úprava: 03.01.2018 11:45 autor: Ivana Stefanová