Parametre funkcií

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.