🧩 Funkce a parametry

Kuchyňský robot

O čem to je

Kuchyňský robot má tlačítko „Šlehat“. Dáš do něj vajíčka a cukr, zmáčkneš ho a dostaneš pěnu. Nemusíš vědět, jak uvnitř funguje motor. Stačí vědět, co dovnitř dát a co dostaneš ven.

Funkce v programu je takové tlačítko. Kus kódu jednou napíšeš, pojmenuješ a pak ho voláš, kolikrát chceš. Program je kratší, přehlednější a chybu opravíš na jednom místě.

Nové pojmy

FunkcePojmenovaný kus kódu, který udělá jednu úlohu. Spustí se, když ji zavoláš jejím jménem a závorkami.print(), len() a input() jsou funkce, které už Python má.
Definice funkce defŘádek def jmeno(parametry): vytvoří novou funkci. Pod ním je odsazené tělo. Definice sama nic neprovede, funkce se spustí až voláním.def pozdrav(): → print("Ahoj")
Parametr a argumentParametr je proměnná v hlavičce funkce, do které funkce dostane vstup. Argument je konkrétní hodnota, kterou předáš při volání.V def obsah(a, b): jsou a, b parametry. Ve volání obsah(3, 4) jsou 3 a 4 argumenty.
Návratová hodnota returnreturn funkci ukončí a vrátí výsledek tam, odkud byla zavolána. Výsledek můžeš uložit do proměnné nebo s ním dál počítat.def dvakrat(n): return n * 2 – dvakrat(5) vrátí 10.

Funkce krok za krokem

  • def obsah_obdelniku(a, b):
  •     s = a * b
  •     return s
  •  
  • vysledek = obsah_obdelniku(3, 4)
  • print(vysledek)
Python si zapamatuje definici funkce, ale nic nespustí.
Na řádku s voláním skočí do funkce: a = 3, b = 4.
Spočítá s = 12 a return vrátí 12.
Hodnota 12 se uloží do vysledek a print ji vypíše.
Co vypíše def dvakrat(n): return n * 2 a pak print(dvakrat(dvakrat(3)))?
Nejdřív se spočítá vnitřní volání: dvakrat(3) = 6. Pak dvakrat(6) = 12.
Napiš funkci, která vrátí větší ze dvou čísel.
def vetsi(a, b): → if a > b: return a → return b. Když je a větší, první return funkci ukončí. Jinak se dojde k return b. vetsi(3, 8) vrátí 8.
✗def soucet(a, b): print(a + b) a pak x = soucet(2, 3) * 10.
✓def soucet(a, b): return a + b a pak x = soucet(2, 3) * 10, tedy 50.

print jen vypíše na obrazovku. Funkce bez return vrací None a s None nejde počítat.

Funkce je pojmenovaný kus kódu. def ji definuje, voláním se spustí. Parametry jsou vstupy, return vrací výsledek. Bez return funkce vrací None.

Proměnné ve funkci

O čem to je

Když ve škole napíšeš „Novák“, myslíš spolužáka ze své třídy. Ve vedlejší třídě může být jiný Novák. Jména platí jen v určité „místnosti“. U funkcí je to stejné: proměnná vytvořená uvnitř funkce existuje jen uvnitř.

Kdo tomu rozumí, nedělá záhadné chyby typu „proč se mi proměnná nezměnila“. Naučíš se taky výchozí a pojmenované parametry, které Python používá všude.

Nové pojmy

Funkce a voláníFunkce je pojmenovaný kus kódu definovaný pomocí def. Volání jmeno(argumenty) ji spustí. Argumenty se dosadí do parametrů v pořadí, v jakém jsou napsané.def obvod(a, b): return 2 * (a + b) a volání obvod(3, 4) vrátí 14.
return a Nonereturn hodnota funkci ukončí a vrátí výsledek. Funkce bez return vrátí speciální hodnotu None (nic).def ahoj(): print("ahoj") – print(ahoj()) vypíše „ahoj“ a pak None.
Lokální proměnnáProměnná vytvořená uvnitř funkce (i parametr). Existuje jen během volání funkce a zvenku není vidět.Proměnná s v těle funkce.
Globální proměnnáProměnná vytvořená mimo všechny funkce. Funkce ji může číst, ale přiřazením uvnitř funkce vznikne nová lokální proměnná se stejným jménem.pocet = 0 na začátku programu.
Výchozí hodnota parametruParametr s hodnotou v hlavičce (b=1). Když argument při volání vynecháš, použije se tato hodnota.def obvod(a, b=1): – obvod(3) počítá s b = 1.
Pojmenovaný argumentArgument předaný jménem parametru. Pořadí pak nehraje roli.obvod(b=2, a=5)

Kde proměnná žije

  • def zvetsi(x):
  •     x = x + 1
  •     return x
  •  
  • x = 5
  • zvetsi(x)
  • print(x)

Vypíše 5, ne 6. Parametr x uvnitř funkce je lokální kopie. Funkce ji zvětší na 6 a vrátí, ale vrácenou hodnotu nikdo neuložil. Globální x zůstalo 5. Správně: x = zvetsi(x).

VoláníabVýsledek 2 * (a + b)
obvod(3)31 (výchozí)8
obvod(3, 4)3414
obvod(b=2, a=5)5214

Proč psát funkce

  • Znovupoužitelnost: kód napíšeš jednou a voláš ho mnohokrát.
  • Přehlednost: dobře pojmenovaná funkce (spocitej_prumer) vysvětlí, co kód dělá.
  • Dekompozice: velký problém rozložíš na malé funkce a každou vyřešíš zvlášť.
  • Testování: malou funkci snadno vyzkoušíš samostatně.
Napiš funkci prumer(a, b, c), která vrátí průměr tří čísel. Kolik vrátí prumer(1, 2, 6)?
def prumer(a, b, c): return (a + b + c) / 3. Závorky jsou nutné, jinak by se dělilo jen c. (1 + 2 + 6) / 3 = 9 / 3 = 3.0 (dělení / vrací float).
Co vypíše def f(): y = 10 a pak f() a print(y)?
Chybu NameError. Proměnná y je lokální, po skončení funkce zanikne a mimo funkci neexistuje.
✗Funkce změní globální proměnnou, když do svého parametru se stejným jménem přiřadí novou hodnotu.
✓Přiřazení uvnitř funkce mění jen lokální proměnnou. Výsledek vrať přes return a ulož: x = zvetsi(x).

Každé volání funkce má vlastní lokální proměnné, které po návratu zanikají.

Parametry a proměnné ve funkci jsou lokální a po návratu zanikají. Výsledek předávej přes return. Výchozí hodnoty (b=1) a pojmenované argumenty (b=2) dělají volání pohodlnější.