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čí.