Vlastní funkce

Po vysvětlení pojmu funkce, jejich významu, použití, interakce s ostatními částmi programu pomocí parametrů a návratové hodnoty nám již nic nebrání, abychom si ukázali, jak v Pythonu lze vytvářet vlastní funkce.

Výpočet faktoriálu

Postup si ukážeme na konkrétním příkladu - výpočet faktoriálu nezáporného celého čísla.

faktorial3.py
# definice funkce na výpočet faktoriálu
 
def faktorial(n):
    """
    výpočet faktoriálu
 
    návratová hodnota (typu int) je vypočtena jako n!
    pro zadané n (nezáporný int)
    """
    if n == 0:
        return 1
    vysledek = n
    for i in range(2, n):
        vysledek = vysledek * i
    return vysledek
 
# příklad použití právě definované funkce:
# výpis tabulky hodnot n! v rozsahu 0 až 20
 
# hlavní program
 
for i in range(21):
    print(i, '! = ', faktorial(i), sep = '')

Povšimněte si následujících skutečností:

Definici funkce bychom mohli ještě zjednodušit, např. do tvaru

def faktorial(n):
    if n == 0:
        return 1
    for i in range(2, n):
        n = n * i
    return n

Vidíme, že i proměnnou odpovídající některému z parametrů můžeme použít pro výpočty uvnitř funkce, jedná se stále o lokální proměnnou.3)

Skládá-li se náš program z více funkcí, uvádíme je postupně za sebou. Na pořadí přitom nezáleží, je pouze nutné mít definice funkcí před jejich prvním použitím. Proto se hlavní program uvádí až na konci souboru za ostatními funkcemi.

Juliánské datum

Pro určení časových okamžiků v běžném životě používáme občanský kalendář (v současné době gregoriánský). Pro použití např. v astronomii však není příliš vhodný4), tam se spíše setkáme s časovými údaji v juliánských dnech či z nich odvozených veličin.

Jako další příklad napíšeme funkci, která pro platné datum dle současného kalendáře určí číslo juliánského dne5). Použijeme algoritmus dle uvedeného odkazu na Wikipedii (tam hledejte i případné podrobnější vysvětlení).

Naše funkce jul_datum vyžaduje tři celočíselné parametry (den, měsíc, rok) dle požadovaného data a její návratová hodnota je vypočtené číslo juliánského dne JDN (typu int). V hlavním programu je ukázáno použití pro zjištění JDN pro zadané datum i určení časového intervalu v dnech mezi dvěma daty.

julian.py
def jul_datum(den, mesic, rok):
    """
    výpočet juliánského data
 
    pro zadaný den, měsíc a rok vypočte juliánské datum (JDN),
    předpokládá vstupní parametry dle gregoriánského kalendáře
    (datum musí být platné, parametry kladné int)
    viz. https://cs.wikipedia.org/wiki/Juli%C3%A1nsk%C3%A9_datum
    """
    if mesic <= 2:
        r = rok + 4799
        n = mesic + 9
    else:
        r = rok + 4800
        n = mesic - 3
    e = den + (153 * n + 2) // 5
    # návratová hodnota typu int
    return e + 365 * r + r // 4 - r // 100 + r // 400 - 32045
 
# hlavní program
print("1.1.2000 =>", jul_datum(1, 1, 2000))
print("Dní mezi 15.9.2009 a 15.9.2010:", \
        jul_datum(15, 9, 2010) - jul_datum(15, 9, 2009))
print("Dní mezi 15.9.2011 a 15.9.2012:", \
        jul_datum(15, 9, 2012) - jul_datum(15, 9, 2011))
1)
Pro pojmenování funkcí platí stejná pravidla jako pro proměnné, mj. je potřeba vyhnout se klíčovým slovům jazyka apod.
2)
Již víme, že více parametrů je odděleno čárkou, seznam parametrů může být i prázdný (kulaté závorky však uvádíme i v tomto případě).
3)
V tomto případě snad stojí za vysvětlení, že parametr n se funkci range předává pouze jednou (tj. před změnou své hodnoty), takže výpočet proběhne podle našeho očekávání.
4)
např. není na první pohled zřejmé, kolik dní je mezi dvěma zadanými daty
5)
přesněji řečeno se jedná o číslo dne začínajícího uvedeného data v poledne UTC