Funkce¶
Až do této chvíle jsme používali funkce (print, range, input, ...()
), které
napsal někdo jiný. Nyní si ukážeme, jak napsat funkce vlastní a jak funkce
fungují.
Funkce jsou bloky kódu v logickém celku. Funkce se používají buď pro kód, který plánujeme vykonávat opakovaně, především ale pro přehlednější členění kódu v souboru.
Příklad nové funkce
def obvod_obdelnika(sirka, vyska):
"""Vrátí obvod obdélníka daných rozměrů"""
return 2 * (sirka + vyska)
# použití funkce obvod_obdelnika
print(obvod_obdelnika(4, 2))
Funkce má následující rozepsanou strukturu
jméno funkce
│
+──────+──────+
| |
def obvod_obdelnika(sirka, vyska):
| |
+────+─────+
|
seznam argumentů
"""Vrátí obvod obdélníka daných rozměrů"""
| |
+────── Dokumentační řetězec. ───────+
return 2 * (sirka + vyska)
| |
+────────+────────+
|
návratová hodnota
Každá funkce je uvozena klíčovým slovem def, následuje její jméno a v závorce seznam argumentů. Za dvojtečkou následuje odsazený blok kódu.
Je dobrým zvykem ihned po definici funkce přidat dokumentační řetězec a funkci ukončit nějakou návratovou hodnotou
Poznámka
Dokumentační řetězec ani return
výraz na konci funkce nejsou nijak
povinné, nicméně patří k dobré praxi je dodržovat. Dokumentování funkci
(tříd, metod) nemá v Pythonu závazná pravidla, je však dobré dodržovat
některý ze stylů. Tím
zároveň zajistíte možnost někdy v budoucnu automaticky generovat dokumentaci
přímo z kódu.
Tělo funkce může obsahovat libovolný kód (dokonce i jinou vnořenou funkci), podmínky, smyčky a podobně.
def napis_hlasku(nazev, skore):
"Popíše skóre. Název má být přivlastňovací přídavné jméno."
print(nazev, 'skóre je', str(skore))
if skore > 1000:
print('Světový rekord!')
elif skore > 100:
print('Skvělé!')
elif skore > 10:
print('Ucházející.')
elif skore > 1:
print('Aspoň něco')
else:
print('Snad příště.')
napis_hlasku('Tvoje', 256)
napis_hlasku('Protivníkovo', 5)
Když funkce voláme, předáváme jim argumenty. Ty musí být ve stejném pořadí, v jakém jsou definovány v hlavičce funkce - tedy v tomto příkladě nejprve název a potom skóre.
Poznámka
Není to tak úplně pravda, argumenty můžeme zapsat i ve zpřeházeném pořadí, musíme je však explicitně pojmenovat, např. napis_hlasku(skore=15, nazev=‘Naše‘).
Platnost proměnných ve funkcích¶
Proměnné v Pythonu mají platnost v blocích kódu a ve všech vnořených blocích.
coordinates = [100, 200]
def move(x, y):
orig_value = coordinates
coordinates[0] = coordinates[0] + x
coordinates[1] += y # zkrácená forma "přičti proměnnou y k původní hodnotě
print(coordinates)
move(5, 4)
print(coordinates)
Po vykonání bychom měli dostat následující výstup:
[100, 200]
[105, 104]
pokud bychom ale zkusili vytisknout hodnoty proměné orig_value, která je definována uvnitř těla funkce, se zlou se potážeme:
print(orig_value)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'orig_value' is not defined
orig_value
je lokální proměnná