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 poslať do inej funkcie? 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í:
pozdrav_vypis("Miška") # Vypíše: Ahoj, Miška!
sprava = pozdrav_vrat("Miška") # Nič nevypíše, ale uloží výsledok
print(sprava) # Vypíše: Ahoj, Miška!
print(sprava.upper()) # Vypíše: AHOJ, MIŠKA!
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 za return sa nevykoná.
def test(cislo):
return cislo * 2
print("Toto sa nikdy nevypíše") # tento riadok sa nedosiahne
vysledok = test(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
obsah = obsah_obdlznika(5, 3)
print("Obsah je: " + str(obsah))
# Výsledok môžeme rovno použiť vo výpočte
dvojnasobny_obsah = obsah_obdlznika(5, 3) * 2
print(dvojnasobny_obsah)
Lokálne premenné
Keď vo vnútri funkcie vytvoríš premennú, táto premenná existuje len vo vnútri tej 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 vznikla vo vnútri funkcie vypocitaj() a po jej skončení zanikla. Mimo funkcie ju nenájdeš.
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 parameter 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 return vráti hodnotu z funkcie späť na miesto, kde bola zavolaná.
- Po vykonaní return sa funkcia okamžite ukončí.
- Funkcia s return je flexibilnejšia ako funkcia len s print() - jej výsledok môžeš ďalej použiť.
- Lokálna premenná existuje len vo vnútri funkcie, po jej skončení zanikne.
- Globálna premenná je viditeľná z celého programu, ale meniť ju vo funkciách nie je dobrá prax.
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átá DPH 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átá DPH 20 %, výsledok je 180.0.