23. Lokální a globální proměnné#

Lokální proměnné jsou proměnné, které jsou definovány uvnitř funkce a jsou viditelné pouze v rámci této funkce. To znamená, že lokální proměnné nejsou přístupné mimo tuto funkci. Tím se zajišťuje izolace dat a zabraňuje se konfliktům názvů proměnných v různých částech programu.

Opakem lokálních proměnných jsou globální proměnné. Ty je možno měnit i uvnitř nějaké funkce. Práce s těmito proměnnými je zpravidla považována za nedobrou programátorskou techniku a proto je lepší se globálním proměnným vyhnout.

23.1. Jak fungují lokální proměnné#

Lokální proměnné mají několik klíčových vlastností:

  1. Omezená viditelnost: Jsou viditelné pouze uvnitř funkce, ve které byly definovány. Mimo tuto funkci nejsou přístupné.

  2. Životnost: Existují pouze po dobu běhu funkce. Jakmile funkce skončí své vykonávání, lokální proměnné jsou odstraněny a ztrácejí svou hodnotu.

  3. Unikátnost názvů: Název lokální proměnné má smysl pouze uvnitř této funkce. Jiné funkce však mohou mít svoji lokální proměnnou se stejným názvem

Lokální proměnné jsou užitečné pro uchovávání dočasných dat a provádění operací v rámci jedné funkce, aniž by docházelo k ovlivněním proměnných v jiných částech programu.

def pozdrav():
    jmeno = "Jano"
    print(f"Ahoj {jmeno}!")

pozdrav()  # Volání funkce pozdrav
# Výstup: Ahoj Jano!

V tomto příkladu je proměnná jmeno definována uvnitř funkce pozdrav() a je tak považována za lokální proměnnou této funkce. To znamená, že není přístupná mimo tuto funkci. Pokud byste se pokusili vytisknout hodnotu jmeno mimo funkci pozdrav(), dostanete chybu, protože proměnná jmeno je pro tuto část kódu neviditelná.

print(jmeno)  # Toto vyvolá chybu: NameError: name 'jmeno' is not defined

23.2. Jak přistupovat k hodnotám lokálních proměnných#

Pokud chceme mít přístup k lokálním proměnným i po ukončení běhu funkce, stačí tyto proměnné předat v návratové hodnotě funkce. Tedy výstupem funkce bude nějaká struktura umožňující předat více informací. Například seznam nebo slovník.

23.2.1. Vracení několika hodnot jako seznam#

def vrat_promenne():
    jmeno = "Jan"
    vek = 30
    return [jmeno, vek]

data = vrat_promenne()  # Funkce vrátí seznam s lokálními proměnnými
jmeno, vek = data  # Rozbalení seznamu na lokální proměnné
print(f"Jméno: {jmeno}, Věk: {vek}")

Tímto způsobem jsou lokální proměnné jmeno a vek vráceny jako součást seznamu a následně jsou rozbaleny a uloženy do jiných lokálních proměnných mimo funkci.

Podobným způsobem můžeme například získat informace o počtu řádků a sloupců dvourozměrného pole knihovny NumPy.

import numpy as np
a = np.eye(7)[:4]  # pole o ctyrech radcich a sedmi sloupcich
radky, sloupce = a.shape

23.2.2. Vracení několika hodnot jako slovník#

def vrat_promenne():
    jmeno = "Jan"
    vek = 30
    vystup = {} # Prazdny slovnik
    vystup['jmeno'] = jmeno  # Naplneni slovniku 
    vystup['vek'] = vek
    return vystup

data = vrat_promenne()  # Funkce vrátí slovník s lokálními proměnnými
jmeno = data["jmeno"]  # Přistupování k hodnotám pomocí klíčů slovníku
vek = data["vek"]
print(f"Jméno: {jmeno}, Věk: {vek}")

Tady jsou lokální proměnné vráceny jako slovník, což umožňuje snadné přistupování k nim pomocí klíčů.

Tímto způsobem vrací informace například funkce solve_ivp urená pro řešení matematických modelů založených na diferenciálních rovnicích.

23.3. Úkol#

Následujcí funkce vrací funkční hodnoty logistické funkce.

def logisticky_rust(x, r=1, K=1):
    """
    Funkce vrací funkční hodnotu funkce logistického růstu 
    y = r*x*(1-x/K)
    v bodě x. Volitelnými parametry jsou parametry r a K.
    """
    vystup = r*x*(1-x/K)
    return vystup

Modifikujte funkci tak, aby kromě hodnoty pro rychlost růstu

\[rx\left(1-\frac xK\right)\]
vracela i hodnotu
\[r\left(1-\frac xK\right)\]
pro specifickou rychlost růstu. Výstupem bude slovník, který bude mít klíče rychlost_rustu a specificka_rychlost_rustu, obsahující vypočtené hodnoty.