Lekcie
Funkcie II. - vrátenie výsledku a lokálny poriadok
Funkcie ti môžu výsledok nielen vypísať, ale aj vrátiť na ďalšie spracovanie. Dozvieš sa aj to, kde tvoje premenné "žijú".
Príkaz return
V minulej lekcii sme tvorili funkcie, ktoré výsledok rovno vypísali
pomocou print(). To je fajn, ale čo ak chceme výsledok funkcie použiť
ďalej - napríklad ho uložiť do premennej, použiť vo výpočte alebo použiť ako argument v inej funkcii? Na to slúži príkaz return.
Porovnaj tieto dve funkcie:
# Funkcia, ktorá výsledok vypíše
def pozdrav_vypis(meno):
print("Ahoj, " + meno + "!")
# Funkcia, ktorá výsledok vráti
def pozdrav_vrat(meno):
return "Ahoj, " + meno + "!"
Na prvý pohľad vyzerajú podobne. Rozdiel sa ukáže pri ich použití:
def pozdrav_vypis(meno):
print("Ahoj, " + meno + "!")
def pozdrav_vrat(meno):
return "Ahoj, " + meno + "!"
pozdrav_vypis("Miša") # Vypíše: Ahoj, Miša!
sprava = pozdrav_vrat("Miša") # Nič nevypíše, ale uloží výsledok
print(sprava) # Vypíše: Ahoj, Miša!
print(sprava.upper()) # Vypíše: AHOJ, MIŠA!
Funkcia s return je oveľa
flexibilnejšia - jej výsledok môžeme uložiť, vypísať, použiť vo výpočte alebo
poslať ďalej. Funkcia s print() výsledok len zobrazí a
tým to končí.
Keď funkcia vykoná príkaz return, okamžite sa ukončí. Akýkoľvek kód pod return sa nevykoná.
def nasob(cislo):
return cislo * 2
print("Toto sa nikdy nevypíše") # tento riadok sa nedosiahne
vysledok = nasob(5)
print(vysledok) # Vypíše: 10
Použitie return vo výpočtoch
Práve pri matematických výpočtoch sa return
ukáže ako veľmi užitočný. Namiesto toho, aby sme výsledok len vypísali, tak ho vrátime
a môžeme s ním ďalej pracovať.
def obsah_obdlznika(sirka, vyska):
return sirka * vyska
# Výsledok si uložíme do premennej a vypíšeme
obsah_zahrady = obsah_obdlznika(15, 10)
print("Obsah záhrady je: " + str(obsah_zahrady))
Lokálne premenné
Keď vo vnútri funkcie vytvoríš premennú, táto premenná existuje len vo vnútri tejto funkcie. Hovoríme, že je lokálna. Mimo funkcie ju Python nepozná.
def vypocitaj():
vysledok = 100 # lokálna premenná
print(vysledok)
vypocitaj() # Vypíše: 100
print(vysledok) # NameError - premenná vysledok tu neexistuje!
Premenná vysledok je lokálna pre funkciu vypocitaj(). Mimo funkcie nie je prístupná.
Prečo je to takto?
- Funkcie sú navrhnuté tak, aby boli nezávislé.
- Každá funkcia má svoj vlastný "priestor" pre premenné. Vďaka tomu môžeš v rôznych funkciách používať rovnaké názvy premenných bez toho, aby sa navzájom ovplyvňovali.
Globálne vs. lokálne premenné
Premenné vytvorené mimo funkcie sú globálne - viditeľné z celého programu vrátane funkcií. Premenné vytvorené vo vnútri funkcie sú lokálne - existujú len počas behu tej funkcie.
sprava = "Dobrý deň!" # globálna premenná
def vypis_spravu():
print(sprava) # funkcia vidí globálnu premennú
vypis_spravu() # Vypíše: Dobrý deň!
Funkcia vie čítať globálnu premennú, avšak nemala
by ju meniť. Ak ju chceme zmeniť, je lepší postup odovzdať ju ako argument a vrátiť novú hodnotu cez return. Takýto kód je
prehľadnejší a menej náchylný na chyby.
| Lokálna premenná | Globálna premenná |
|---|---|
| Vytvorená vo vnútri funkcie. | Vytvorená mimo akejkoľvek funkcie. |
| Existuje len počas behu funkcie. | Existuje počas celého behu programu. |
| Mimo funkcie ju Python nepozná. | Viditeľná aj vo vnútri funkcií. |
Zopakuj si!
- Príkaz
returnvráti hodnotu z funkcie späť na miesto, kde bola zavolaná. - Po vykonaní
returnsa funkcia okamžite ukončí. - Lokálna premenná existuje len vo vnútri funkcie a mimo nej nevieme k nej pristupovať.
- Globálna premenná je viditeľná z celého programu, ale meniť ju vo funkciách nie je dobrá prax.
vypocitat_cenu() s tromi parametrami cena, dan a zlava.Všetky parametre sú typu
int. Parametre dan a zlava sú hodnoty v percentách.Funkcia musí vrátiť hodnotu typu
float - výsledok bude cena, od ktorej je odrátaných zlava percent a následne prirátaných dan percent.Príklad:
vypocitat_cenu(100, 20, 10) - cena je 100, zľava je 10%, čiže cena po zľave je 90. K tej sa priráta daň 20%, výsledok je 108,0.Príklad #2:
vypocitat_cenu(200, 20, 25) - cena je 200, zľava je 25 %, čiže cena po zľave je 150. K tej sa priráta daň 20%, výsledok je 180,0.