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.
Postup si ukážeme na konkrétním příkladu - výpočet faktoriálu nezáporného celého čísla.
# 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í:
return
, ukončí vykonávání funkce a vrátí řízení za místo volání funkce. Případný výraz (konstanta, proměnná) za return
se považuje za návratovou hodnotu funkce. V definici funkce může být i více příkazů return
, nemusí tam být však žádný - v takovém případě se funkce ukončí za posledním příkazem odsazeného bloku. Pokud není návratová hodnota určena, použije se hodnota None
datového typu NoneType
.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.
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.
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))
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í.