Uvod
Python je jedan od najpopularnijih programskih jezika na svijetu. U Pythonu, parametri su dio definicija funkcija. Oni vam omogućuju da odredite određene argumente za funkciju. Funkcija može prihvatiti i primijeniti taj argument.
Međutim, u trenutku pisanja koda nije vam moguće znati koji točno slučajevi upotrebe mogu biti implementirani s vašim kodom. Stoga je, radi budućih programera i korisnika vašeg programa, preporučljivo proslijediti varijabilan broj argumenata funkciji. Da biste to učinili, morate koristiti posebne parametre. To su *args i **kwargs. U ovom vodiču ćemo naučiti sve o *args i **kwargs parametrima u Pythonu. Također ćemo naučiti kako poredati argumente i kako ih primijeniti u pozivima funkcija.
Preduvjeti
Kako biste mogli pratiti korake u vodiču, morate pripremiti neke preduvjete. Prvo, morate imati instaliran Python 3 na vašem poslužitelju s aktivnim programskim okruženjem. Također morate imati instaliran program za vaš specifični operacijski sustav (Ubuntu, CentOS, Debian, itd.).
Što je *args i kako radi?
Započnimo s razumijevanjem kako *args radi. Verzija parametra s jednom zvjezdicom koristi se za slanje popisa argumenata varijabilne duljine bez ključnih riječi funkcijama. Imajte na umu da je zvjezdica najvažniji element u tom parametru.
Da bismo bolje razumjeli, razmotrimo primjer. Slijedi tipična funkcija koju možete pronaći u svom kodu, a koja koristi dva argumenta:
|
1 2 |
def multiply(x, y): print (x * y) |
Kao što vidite, naši argumenti u gornjoj funkciji su x i y. Prilikom pozivanja funkcije koristit ćete brojeve koji odgovaraju x i y. Recimo da prosljeđujemo cijele brojeve 5 i 4 za x i y redom:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
Sada možemo pokrenuti kod:
|
1 |
python lets_multiply.py |
Izlaz koji ćemo dobiti bit će sljedeći:
|
1 2 3 |
Izlaz: 20 |
Izlaz pokazuje da su cijeli brojevi 5 i 4 pomnoženi. To znači da je funkcija multiply(x, y) radila.
Sada, recimo da na kraju želimo pomnožiti tri broja umjesto samo dva. Nažalost, dodavanje dodatnog broja gornjoj funkciji rezultirat će ovakvom pogreškom:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Izlaz: TypeError: multiply() takes 2 positional arguments but 3 were given |
Stoga, ako pretpostavljate da ćete kasnije možda morati dodati više argumenata, primijenite parametar *args radi vaše praktičnosti. Možete ga koristiti ovako:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
Jednostavno smo zamijenili parametre funkcije x i y s *args. Pokretanje ovog koda dat će vam umnožak za svaki pojedini poziv funkcije ovako:
|
1 2 3 4 5 6 |
Izlaz: 20 90 24 900 |
Stoga je *args idealan za korištenje kada želite poslati popise argumenata varijabilne duljine svojoj funkciji. Zbog njegove mogućnosti, možete proslijediti onoliko argumenata koliko želite u pozivima funkcija. Kao takav, ovaj vam parametar omogućuje izgradnju fleksibilnijeg koda koji može prihvatiti veliku količinu varijabilnih argumenata bez ključnih riječi u funkciju.
Što je **kwargs i kako radi?
Zatim imamo verziju parametara s dvostrukom zvjezdicom, a to je **kwargs. Za razliku od prethodnog oblika, ovaj vam parametar omogućuje prosljeđivanje rječnika argumenata varijabilne duljine s ključnim riječima u funkciju. Slično kao i *args, dvostruke zvjezdice su najkritičniji element parametra.
Kao što smo učinili u prethodnom odjeljku, možete dodati onoliko argumenata koliko želite. Razlika je u tome što morate dodijeliti ključne riječi. Kako biste bolje razumjeli, razmotrite sljedeći primjer. Ovdje ćemo započeti ispisivanjem **kwargs argumenata koje želimo proslijediti funkciji:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
Sada pozovimo funkciju. Kao što vidite, dodali smo ključne argumente:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
Pokretanje programa u ovom trenutku prikazat će vam ovaj izlaz:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Izlaz: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
Međutim, postoji mogućnost da je vaš tip podataka rječnika neuređen. To uvelike ovisi o verziji Pythona 3 koju koristite. Na primjer, bilo koja verzija nakon Pythona 3.6 daje vam parove ključ-vrijednost po redu. Bilo koja verzija prije toga prikazat će izlaz nasumičnim redoslijedom. Rječnik koji izradite zvat će se kwargs. Imajte na umu da ga možete koristiti i manipulirati njime kao i bilo kojim drugim rječnikom u sustavu. Pogledajmo kako možete staviti **kwargs parametar u veću upotrebu i primjenu.
U sljedećem primjeru pokušat ćemo napraviti novu funkciju koja će pozdraviti rječnik s imenima. Naš ogledni rječnik imat će dva imena:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
Pokretanje programa dat će vam ovaj izlaz:
|
1 |
python print_values.py |
|
1 2 3 4 |
Izlaz: The value of your_name is Casey The value of my_name is Sammy |
Slično prethodnom primjeru, rječnici se mogu činiti neuređenima. Kao takav, redoslijed imena Casey i Sammy može biti obrnut u nekim slučajevima.
Zatim ćemo funkciji proslijediti dodatne argumente. To će dokazati da možete učiniti da **kwargs prihvati bilo koji broj argumenata koji želite:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
Pokretanje programa prikazat će vam ovaj izlaz:
|
1 2 3 4 5 6 7 8 |
Izlaz: Vrijednost od of name_2 je Gray Vrijednost od of name_6 je Val Vrijednost od of name_4 je Phoenix Vrijednost od of name_5 je Remy Vrijednost od of name_3 je Harper Vrijednost od of name_1 je Alex |
Ovaj izlaz također može biti neuređen. Bez obzira na to, ovi primjeri pokazuju da **kwargs daje vašem programu fleksibilnost za korištenje niza ključnih argumenata.
Kako poredati argumente
Važno je imati na umu zadani redoslijed prilikom slaganja argumenata u funkciji ili pozivu funkcije. On je sljedeći:
-
Formalni pozicijski argumenti
-
*args
-
Ključni argumenti
-
**kwargs
Recimo da koristite *args i **kwargs s eksplicitnim pozicijskim parametrima. To znači da će vaša funkcija izgledati ovako:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
S druge strane, korištenje ovih parametara s imenovanim ključnim parametrima dat će vašoj funkciji sljedeću opću strukturu:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
Nepoštivanje zadanog redoslijeda rezultirat će sintaktičkom pogreškom prilikom pokretanja koda. Stoga je najbolje izbjeći tu pogrešku u samom početku.
Kako koristiti *args i **kwargs u pozivima funkcija
Na kraju ćemo vam pokazati kako koristiti oba parametra za prosljeđivanje argumenata u funkcije. Započet ćemo s primjerom koji prikazuje *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
U ovoj funkciji postoje tri parametra: arg_1, arg_2, i arg_3. Morate stvoriti varijablu i postaviti je na iterabilni objekt. U ovom slučaju, to će biti tuple. Zatim možete proslijediti varijablu u funkciju pomoću sintakse sa zvjezdicom.
Promatrajte izlaz kada pokrenete program pomoću python some_args.py naredbe:
|
1 2 3 4 5 |
Izlaz: arg_1: Sammy arg_2: Casey arg_3: Alex |
Također je moguće promijeniti program na iterabilnu listu tipa podataka s različitim nazivom varijable. Sljedeći kod kombinira *args s imenovanim parametrom:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
Izlaz će biti sljedeći nakon pokretanja programa:
|
1 2 3 4 5 |
Izlaz: arg_1: 1 arg_2: 2 arg_3: 3 |
S druge strane, možete primijeniti ključne argumente s **kwargs. Obavezno stvorite varijablu koja je jednaka rječniku. Trebala bi imati 2 para ključ-vrijednost. Evo kako ćemo proslijediti varijablu funkciji s 3 argumenta:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
Ponovno upotrijebite python some_kwargs.py naredbu za pokretanje programa:
|
1 2 3 4 5 |
Izlaz: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
Zaključak
Do kraja ovog vodiča trebali biste dobro razumjeti što su *args i **kwargs i kako rade. Sada možete primijeniti ove parametre na vlastiti kod kako biste svoj program učinili fleksibilnim za buduće korisnike. Oni su idealni za situacije u kojima ne znate koliko argumenata može biti upotrijebljeno. Samo pripazite na ključne elemente funkcija i parametara.
Na kraju, evo još resursa s našeg bloga koji će vam pomoći da uspješno radite s Pythonom:
- Format datoteke txt: Rad s običnim tekstualnim datotekama u Pythonu 3
- Petlje u Pythonu 3: Korištenje naredbi Break, Continue i Pass
- Uvoz modula u Pythonu 3: Sveobuhvatni vodič
- Korištenje oblikovatelja nizova u Pythonu 3
- Programiranje u Pythonu 3: Kako konstruirati klase i definirati objekte?
Sretno programiranje!
Komentari
Još nema komentara. Budite prvi.