Python - Argumenti funkcije


U Pythonu možete definisati funkciju koja uzima promjenjivi broj argumenata. U ovoj ćete lekciji naučiti definisati takve funkcije pomoću zadanih, ključnih riječi i proizvoljnih argumenata.



Argumenti

U lekciji korisnički definisane funkcije naučili smo kako definisati funkciju i pozvati je. U suprotnom, poziv funkcije rezultovaće greškom. Pogledajmo primjer:

def greet(name, msg):
    """Funkcija greet
       person sa dostavljenom porukom"""
       print("Pozdrav", name + ', ' + msg)

greet("Miloš", "Dobro jutro!")

Ovdje funkcija greet() ima dva parametra. Budući da smo ovu funkciju pozvali s dva argumenta, ona radi glatko i ne dobijamo nikakvu grešku. Ako je pozovemo s različitim brojem argumenata, tumač će prikazati poruku o grešci. Ispod je poziv na ovu funkciju s jednim i bez argumenata zajedno s njihovim odgovarajućim porukama greške.

>>> greet("Monica")    # samo jedan argument
TypeError: greet() missing 1 required positional argument: 'msg'
>>> greet()    # bez argumenata
TypeError: greet() missing 2 required positional arguments: 'name' and 'msg'


Argumenti varijabilne funkcije

Do sada su funkcije imale fiksni broj argumenata. U Pythonu postoje drugi načini za definisanje funkcije koja može uzimati promjenjivi broj argumenata. Tri različita oblika ove vrste opisana su u nastavku.


Python zadani argumenti (Default Arguments)

Argumenti funkcije mogu imati zadane vrijednosti u Pythonu. Argumentu možemo zadati zadanu vrijednost pomoću operatora dodjele (=). Pogledajmo primjer:

def greet(name, msg="Good morning!"):
    """
    Funkcija greet
    person sa
    dostavljenom porukom.

    Ako poruka nije dostavljena,
    po defaultu je "Dobro
    jutro! "
    """

    print("Pozdrav", name + ', ' + msg)


greet("Miloš")
greet("Marko", "Kako si?")

U ovoj funkciji, ime parametra nema zadanu vrijednost i potrebno je (obavezno) tokom poziva. S druge strane, parametar msg ima zadanu vrijednost "Dobro jutro!". Dakle, nije obavezno tokom poziva. Ako je navedena vrijednost, ona će zamijeniti zadanu vrijednost.

Bilo koji broj argumenata u funkciji može imati zadanu vrijednost. Ali kada imamo zadani argument, svi argumenti s njegove desne strane moraju imati i zadane vrijednosti. To znači da ne-zadani argumenti ne mogu sljediti zadane argumente. Na primjer, ako smo prethodno definisali zaglavlje funkcije kao:

def greet(msg = "Dobro jutro!", name):

Dobili bismo grešku kao:

SyntaxError: non-default argument follows default argument

Python Argumenti ključnih riječi (Keyword Arguments)

Kada pozivamo funkciju s nekim vrijednostima, te vrijednosti se dodjeljuju argumentima prema njihovom položaju. Na primjer, u gornjoj funkciji greet(), kada smo je nazvali greet("Marko", "Kako si?"), Vrijednost "Marko" dodjeljuje se imenu argumenta "Kako si?" poruke. Python omogućava pozivanje funkcija pomoću argumenata ključne riječi. Kada funkcije pozivamo na ovaj način, redosljed (position) argumenata može se promijeniti. Svi sljedeći pozivi gornjoj funkciji su valjani i daju isti rezultat.

# 2 argumenta ključnih riječi
greet(name = "Marko",msg = "Kako si?")

# 2 argumenta ključnih riječi (izvan redosljeda)
greet(msg = "Kako si?",name = "Marko") 

# 1 pozicijski, 1 argument ključne riječi
greet("Marko", msg = "Kako si?")          

Kao što vidimo, pozicijske argumente možemo miješati s argumentima ključnih riječi tokom poziva funkcije. Ali moramo imati na umu da argumenti ključnih riječi moraju sljediti pozicijske argumente. Imati pozicijski argument nakon argumenata ključne riječi rezultovaće greškama. Na primjer, poziv funkcije:

greet(name="Marko","Kako si?")

Python arbitrarni argumenti (Arbitrary Arguments)

Ponekad ne znamo unaprijed broj argumenata koji će se prosljediti u funkciju. Python nam omogućava da ovu situaciju riješimo pozivima funkcija s proizvoljnim brojem argumenata. U definiciji funkcije koristimo zvjezdicu (*) prije imena parametra da označimo ovu vrstu argumenta. Pogledajmo primjer:

def greet(*names):
    """Funkcija greet sva
     imena stavlja u korpi names."""

    # names je korpa s argumentima
    for name in names:
        print("Pozdrav", name)


greet("Miloš", "Marko", "Maja", "Stipe")

Ovdje smo pozvali funkciju s više argumenata. Ovi se argumenti zamotavaju u skup prije nego što se prosljede u funkciju. Unutar funkcije koristimo petlju for za povrat svih argumenata.