V predchádzajúcom texte sme si ukázali, ako pomocou funkcií dokážeme rovnakú postupnosť príkazou v kóde nahradiť jedným príkazom. Často sa však stáva, že potrebujeme často spraviť veľmi podobné operácie, ale napr. s inou premennou. Tu nám pomôže, že môžeme funkcií dať nejaké parametre.
Predstavme si, napríklad že potrebujeme na viacerých miestach zistiť, či je číslo párne a odpoveď vypísať. Funkcia, ktorá vypíše, či je číslo párne, alebo nepárne može vyzerať napr. takto.
def vypisParitu(cislo):
if cislo%2 == 0:
print("Parne cislo.")
else:
print("Neparne cislo.")
Môžete si všimnút, že táto funkcia nič nevracia. V programe ju vieme použiť napr. takto:
def vypisParitu(cislo):
if cislo%2 == 0:
print("Parne cislo.")
else:
print("Neparne cislo.")
vypisParitu(7)
x=754
vypisParitu(x)
vypisParitu(x//2)
Parameter má táto funkcia preto, že jej nejak chceme odovzdať číslo, ktoré potrebuje k rozhodnutiu sa, čo vypísať. Keď chceme funkciu použiť, hovoríme, že ju voláme a teda v programe vidíme dve volania funkcie \textit{vypisParitu}. Pri volaní funkcii odovzdáme naše číslo ako parameter.
Asi najbežnejším použitím funkcií sú funkcie s parametrami, ktoré aj niečo vracajú. Príkladom môže byť funkcia, ktorá sčíta dve čísla.
def scitaj(a, b):
return a+b
# pouzitie:
x, y = 10, 20
vysledok1 = scitaj(x, y)
vysledok2 = scitaj(x, 77)
vysledok3 = scitaj(5, 11)
Vyššie vidíme veľmi jednoduchú funkciu,
ktorá iba sčíta svoje parametre a vráti ich pomocou kľúčového slova return
a potom 3 rôzne korektné použitia tejto funkcie.
Jedna z dôležitých vecí je, ako funguje premenná potom, čo sa stane parametrom. Pokiaľ napíšeme jednoduchý program.
def zmen(x):
x = 30
a = 10
print(a)
zmen(a)
print(a)
Po jeho spustení zistíme, že sa hodnota premennej $a$ po zmene vo funkcii zmen
nezmenila.
Je to spôsobené tým, že do funkcie nebola poslaná priamo premenná $a$
ale len jej kópia, ktorá sa po konci vykonávania funkcie zahodí.
Veci sa ale trocha skomplikujú keď spustíme nasledujúci program.
def zmen(x):
x[0] = 30
a = [1, 2, 3]
print(a)
zmen(a)
print(a)
Čakali by sme, že sa $a$ nezmení avšak tentokrát je $a$ list
.
Prečo sa v tomto prípade zmenila hodnota $a$?
Je to z dôvodu, že do funkcie bola v tomto prípade poslaná nie kópia listu ale priamo list $a$.
Je trochu nelogické, prečo sa python správa rôzne pri rôznych typoch.
Je to napríklad z dôvôdu, že listy sú zväčša pomerne veľké,
zaberajú viac miesta a teda aj ich kopírovanie je pomalé a Python sa mu snaží vyhnúť.
Je dôležité si na toto správanie dávať pozor a keď je to dôležité,
vyskúšať ako sa Python správa pre konkrétny typ.