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í:
Omezená viditelnost: Jsou viditelné pouze uvnitř funkce, ve které byly definovány. Mimo tuto funkci nejsou přístupné.
Ž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.
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
rychlost_rustu
a specificka_rychlost_rustu
, obsahující vypočtené hodnoty.