Funkce
Pod sloven funkce si většina ze čtenářů představí funkce matematické, třeba , nebo . Jak bychom takové matematické funkce mohli popsat? Třeba tak, že vezmou nějaké číslo (nazvěme ho argumentem) a vypočítají, vrátí nám, hodnotu funkce , nebo . Předpis funkce si můžeme představit jako tabulku hodnot, ke kterým přiřazujeme jiné hodnoty.1
Funkce v programování jsou velmi podobná věc: je to nějaký kód, kterému předáme argumenty, kód něco provede a vrátí nám výsledek. Ne všechny funkce v Pythonu musí vracet hodnotu.
Vytvořme si jednoduchou funkci, která vrátí násobek dvou čísel:
def nasobek(a, b):
return a * b
Definici funkce začneme klíčovým slovem def, následuje jméno funkce (řídí se stejnými pravidly, jako jména
proměnných v kapitole Štábní kultura) a pak argumenty v závorkách. Potom následuje blok kódu, který
funkce provede a vrátí nám výsledek pomocí klíčového slova return. Tělo funkce musí být jako u podmínek a cyklů
patřičně odsazený.
Naši novou funkci nasobek následně můžeme zavolat pomocí jejího jména a předáním patřičných argumentů. Tím se kód
v definici funkce spustí s předanými argumenty a vrátí nám výsledek.
vysledek = nasobek(3, 4)
print(vysledek)
Funkce nemusí brát žádné argumenty ani nemusí nic vracet, jako například tato funkce:
def pozdrav():
print("Ahoj!")
Hlavní důvod proč používáme funkce je ten, že nám umožňují organizovat kód do menších, jednoduššeji spravovatelných částí. Ty poté můžeme navzájem volat a docílíme tím čitelnějšího kódu. Vraťme se k příkladu se zdravením lidí a napišme funkci, které předáme hodinu dne; funkce vrátí pozdrav vhodný pro danou denní dobu. Funkce je v tomto případě vhodná, protože logiku pozdravu přesuneme na jedno místo a navíc ho pojmenujeme. Tím docílíme toho, že kód neopakujeme a na místě volání víme, co se má provést.
def pozdrav_podle_hodiny(hodina):
if hodina < 12:
return "Dobrý den"
elif hodina < 18:
return "Dobré odpoledne"
else:
return "Dobrý večer"
print(pozdrav_podle_hodiny(9))
print(pozdrav_podle_hodiny(14))
print(pozdrav_podle_hodiny(22))
Ukažme si další příklad, tentokrát funkci pro ověření síly hesla.2 Ověříme, jestli má heslo alespoň 8 znaků a jestli obsahuje číslici.
def je_heslo_bezpecne(heslo):
# zkontrolujeme delku
if len(heslo) < 8:
return False
# zkontrolujeme, zda obsahuje cislici
for char in heslo:
if char.isdigit():
return True
return False
print(je_heslo_bezpecne("heslo123"))
print(je_heslo_bezpecne("heslo"))
Tato funkce funguje, ale její definice by se dala vylepšit. Ve funkci je_heslo_bezpecne kontrolujeme dvě podmínky –
délku hesla a zda obsahuje číslici – a ty můžeme znovu vytáhnout do samostatných funkcí.
def je_slovo_dost_dlouhe(heslo, min_delka):
return len(heslo) >= min_delka
def slovo_obsahuje_cislici(heslo):
for char in heslo:
if char.isdigit():
return True
return False
def je_heslo_bezpecne(heslo):
return je_slovo_dost_dlouhe(heslo, 8) and slovo_obsahuje_cislici(heslo)
print(je_heslo_bezpecne("heslo123"))
print(je_heslo_bezpecne("heslo"))
Tato verze je mnohem čitelnější, protože jsme oběma podmínkám vytvořili vlastní funkce, které poté voláme pomocí jejich jména; pro programátora je to mnohem přehlednější.
Caution
V předchozích kapitolách jsme používali výraz “magické slovíčko” pro
len, apod. Nyní si už můžeme říct, že to jsou ve skutečnosti funkce! Pozor, napříkladint(...),float(...)arange(...)funkce nejsou; více si povíme a nějaké další kapitole. Volání jako.append(...)nebo.split(...)funkce jsou, ale volají se speciálním způsobem, protože se volají na nějakém objektu (pole, řetězec, apod.).
Úlohy
- Nejdelší slovo
-
Napište funkci
nejdelsi_slovo, která jako argument přijímá řetězec a vrátí nejdelší slovo v něm. Pro rozdělení řetězce na slova použijte slovíčkosplit():veta = "Toto je veta" slova = veta.split() print(slova) - Slovo s největší počtem písmen
-
Napište funkci
slovo_s_nejvetsim_poctem_pismen, která jako argument přijímá řetězec a písmeno a vrátí slovo ze vstupního řetězce s největším počtem písmen, které jsou stejné, jako písmeno předané druhám argumentem. - Slovní hodnocení
-
Napište funkci
slovni_hodnoceni, která jako argument přijme známku 1 až 5 a vrátí slovní hodnocení této známky. Pro jiná čísla vrátíNone.