Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 print, len, apod. Nyní si už můžeme říct, že to jsou ve skutečnosti funkce! Pozor, například int(...), float(...) a range(...) 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íčko split():

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.


  1. Ve skutečnosti to nemohou být libovolné hodnoty, ale to prozatím není důležité. ↩

  2. Toto není moc dobrý způsob, jak sílu hesla měřit, vzhledem k tomu, že nejdůležitější faktor síly hesla je jeho náhodnost. Pro náš účel demonstrace práce s funkcemi však postačí. ↩