Lokální proměnné

Uvnitř funkce můžete vytvářet proměnné stejně jako kdekoli jinde. Taková proměnná ale existuje jen uvnitř funkce: vznikne, když se funkce spustí, a zanikne, když funkce skončí. Mimo funkci ji Python nezná:

def rekni_ahoj():
    zprava = "Ahoj!"
    print(zprava)

rekni_ahoj()
print(zprava)

Tento kód vypíše:

Ahoj!
Traceback (most recent call last):
  File "<exec>", line 6, in <module>
NameError: name 'zprava' is not defined

Volání rekni_ahoj() proběhlo v pořádku, ale poslední řádek hledá zprava mimo funkci, kde tato proměnná neexistuje. Stejné je to s parametry: existují jen uvnitř své funkce.

Části programu, ve které proměnná existuje, se říká obor platnosti proměnné (anglicky scope). Proměnná vytvořená uvnitř funkce je lokální: patří jen této funkci. Proměnnou vytvořenou mimo všechny funkce můžete používat v celém programu, i uvnitř funkcí:

nazev_obchodu = "Zverimex Packa"

def vypis_stitek(produkt):
    print(f"{nazev_obchodu}: {produkt}")

vypis_stitek("krmivo pro psy")

Tento kód vypíše:

Zverimex Packa: krmivo pro psy

Proč je užitečné, že lokální proměnné zůstávají uvnitř svých funkcí?

  • Funkce si navzájem nepřekážejí. Dvě funkce mohou mít každá svou proměnnou celkem a jsou to dvě různé proměnné: změna jedné nezmění tu druhou.
  • Abyste mohli funkci použít, stačí vědět, co jí dát (argumenty) a co vrací (návratovou hodnotu). Jak funguje uvnitř, je její věc.
  • Každé volání začíná znovu: proměnné funkce vzniknou nanovo a nic z předchozího volání v nich nezůstane.

Funkce může proměnnou zvenku přečíst, ale nemůže ji jen tak změnit. Když do proměnné uvnitř funkce přiřadíte hodnotu, Python vytvoří novou lokální proměnnou, i když venku existuje proměnná se stejným názvem:

skore = 10

def vynuluj_skore():
    skore = 0

vynuluj_skore()
print(skore)

Tento kód vypíše:

10

Funkce si vytvořila vlastní lokální proměnnou skore a nastavila ji na 0, ale skore venku zůstalo 10. (A skore += 1 uvnitř funkce by dokonce skončilo chybou UnboundLocalError.)

Pravidlo je tedy jednoduché: hodnoty se do funkce dostávají přes parametry a ven z ní pomocí return. Když potřebujete hodnotu zevnitř funkce, nesahejte po její proměnné. Vraťte hodnotu pomocí return a uložte si ji tam, kde funkci voláte.

Pokyny

Program skončí chybou NameError: name 'celkem' is not defined, protože celkem existuje jen uvnitř funkce. Opravte ho: vraťte celkem z funkce. Pod funkcí uložte výsledek volání celkova_cena(25, 4) do proměnné ucet a místo celkem vypište ucet. Program vypíše 100.

Ke každé objednávce se navíc platí 5 za dopravu. Přidejte funkci třetí parametr, doprava, s výchozí hodnotou 5 a uvnitř funkce ho přičtěte k celkové ceně. Program pak vypíše 105.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

8/10