Treci la conținutul principal

*args și **kwargs

În mod normal, un apel de funcție trebuie să furnizeze numărul corect de argumente.

Uneori însă nu poți ști dinainte câte vor fi transmise.

Aceasta este problema pe care o rezolvă *args și **kwargs: permit unei funcții să accepte un număr necunoscut de argumente.


Argumente arbitrare - *args

Când nu poți anticipa câte argumente va primi o funcție, pune un * înaintea numelui parametrului.

Funcția primește atunci argumentele sub forma unui tuplu și poate ajunge la fiecare element după poziția lui.

Documentația Python prescurtează adesea argumentele arbitrare ca *args.

Exemplu

Acceptarea oricărui număr de argumente cu *args:

Prompt
Scrie o funcție care folosește *kids pentru a accepta orice număr de argumente. Afișează al treilea copil. Apeleaz-o cu "Emil", "Tobias", "Linus".
Ieșire: program Python complet

Ce este *args?

O funcție cu parametrul *args poate primi câte argumente poziționale vrea să trimită cel care o apelează.

Toate ajung în args, care în interiorul funcției este un tuplu:

Exemplu

Citirea argumentelor individuale din *args:

Prompt
Scrie o funcție care folosește *args și afișează tipul, primul, al doilea și toate argumentele. Apeleaz-o cu "Emil", "Tobias", "Linus".
Ieșire: program Python complet

Folosirea *args cu argumente obișnuite

Parametrii obișnuiți și *args pot apărea unii lângă alții.

Cei obișnuiți trebuie scriși primii.

Aici, greeting ia valoarea "Hello", iar names adună toate valorile rămase.

Exemplu

Prompt
Scrie o funcție cu un parametru obișnuit greeting și *names. Afișează salutul împreună cu fiecare nume. Apeleaz-o cu "Hello", "Emil", "Tobias", "Linus".
Ieșire: program Python complet

Exemplu practic cu *args

Funcțiile flexibile sunt cazul în care *args ajută cu adevărat:

Exemplu

Adunarea oricâtor valori sunt transmise:

Prompt
Scrie o funcție care folosește *numbers și calculează suma oricărui număr de valori. Testeaz-o cu (1,2,3), (10,20,30,40) și (5).
Ieșire: program Python complet

Exemplu

Căutarea celei mai mari valori:

Prompt
Scrie o funcție care folosește *numbers și găsește valoarea maximă. Returnează None dacă nu primește nicio valoare. Testeaz-o cu (3, 7, 2, 9, 1).
Ieșire: program Python complet

Argumente cu nume arbitrare - **kwargs

Când nu poți anticipa câte argumente cu nume va primi o funcție, pune două asteriscuri ** înaintea numelui parametrului.

Funcția le primește atunci sub forma unui dicționar și poate căuta fiecare element după cheia lui.

Documentația Python prescurtează adesea argumentele cu nume arbitrare ca **kwargs.

Exemplu

Acceptarea oricărui număr de argumente cu nume cu **kwargs:

Prompt
Scrie o funcție care folosește **kid pentru a accepta argumente cu nume. Afișează numele de familie. Apeleaz-o cu fname="Tobias", lname="Refsnes".
Ieșire: program Python complet

Ce este **kwargs?

O funcție cu parametrul **kwargs poate primi câte argumente cu nume vrea să trimită cel care o apelează.

Toate ajung în kwargs, care în interiorul funcției este un dicționar:

Exemplu

Citirea valorilor din **kwargs:

Prompt
Scrie o funcție care folosește **myvar și afișează tipul, numele, vârsta și toate datele. Apeleaz-o cu name="Tobias", age=30, city="Bergen".
Ieșire: program Python complet

Folosirea **kwargs cu argumente obișnuite

Parametrii obișnuiți și **kwargs funcționează și ei împreună.

Și aici, cei obișnuiți sunt scriși primii:

Exemplu

Prompt
Scrie o funcție cu username și **details. Afișează numele de utilizator și toate detaliile suplimentare. Apeleaz-o cu "emil123" și argumente cu nume suplimentare.
Ieșire: program Python complet

Combinarea *args și **kwargs

O funcție poate avea atât *args, cât și **kwargs.

Scrie parametrii în această ordine:

  1. parametrii obișnuiți
  2. *args
  3. **kwargs

Exemplu

Prompt
Scrie o funcție cu title, *args și **kwargs. Afișează toate trei. Apeleaz-o cu argumente poziționale și argumente cu nume amestecate.
Ieșire: program Python complet

Despachetarea argumentelor

Poți scrie * și ** și într-un apel de funcție. Acolo ele despachetează (extind) o listă sau un dicționar în argumente individuale.

Reține: Într-o definiție, * și ** colectează argumente. Într-un apel, le despachetează.

Exemplu

Transformarea unei liste în argumente separate cu *:

Prompt
Scrie o funcție care primește trei parametri și returnează suma lor. Folosește * pentru a despacheta o listă [1, 2, 3] în apelul funcției.
Ieșire: program Python complet

Exemplu

Transformarea unui dicționar în argumente cu nume cu **:

Prompt
Scrie o funcție care primește fname și lname și afișează un salut. Folosește ** pentru a despacheta un dicționar în apelul funcției.
Ieșire: program Python complet