*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:
*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
def my_function(*kids):
print("Cel mai mic copil este " + kids[2])
my_function("Emil", "Tobias", "Linus")
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:
*args și afișează tipul, primul, al doilea și toate argumentele.
Apeleaz-o cu "Emil", "Tobias", "Linus".
Ieșire: program Python complet
def my_function(*args):
print("Tip:", type(args))
print("Primul argument:", args[0])
print("Al doilea argument:", args[1])
print("Toate argumentele:", args)
my_function("Emil", "Tobias", "Linus")
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
greeting și *names.
Afișează salutul împreună cu fiecare nume. Apeleaz-o cu "Hello", "Emil", "Tobias", "Linus".
Ieșire: program Python complet
def my_function(greeting, *names):
for name in names:
print(greeting, name)
my_function("Hello", "Emil", "Tobias", "Linus")
Exemplu practic cu *args
Funcțiile flexibile sunt cazul în care *args ajută cu adevărat:
Exemplu
Adunarea oricâtor valori sunt transmise:
*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
def my_function(*numbers):
total = 0
for num in numbers:
total += num
return total
print(my_function(1, 2, 3))
print(my_function(10, 20, 30, 40))
print(my_function(5))
Exemplu
Căutarea celei mai mari valori:
*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
def my_function(*numbers):
if len(numbers) == 0:
return None
max_num = numbers[0]
for num in numbers:
if num > max_num:
max_num = num
return max_num
print(my_function(3, 7, 2, 9, 1))
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:
**kid pentru a accepta argumente cu nume.
Afișează numele de familie. Apeleaz-o cu fname="Tobias", lname="Refsnes".
Ieșire: program Python complet
def my_function(**kid):
print("Numele lui de familie este " + kid["lname"])
my_function(fname = "Tobias", lname = "Refsnes")
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:
**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
def my_function(**myvar):
print("Tip:", type(myvar))
print("Nume:", myvar["name"])
print("Vârstă:", myvar["age"])
print("Toate datele:", myvar)
my_function(name = "Tobias", age = 30, city = "Bergen")
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
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
def my_function(username, **details):
print("Nume de utilizator:", username)
print("Detalii suplimentare:")
for key, value in details.items():
print(" " + key + ":", value)
my_function("emil123", age = 25, city = "Oslo", hobby = "coding")
Combinarea *args și **kwargs
O funcție poate avea atât *args, cât și **kwargs.
Scrie parametrii în această ordine:
- parametrii obișnuiți
- *args
- **kwargs
Exemplu
title, *args și **kwargs.
Afișează toate trei. Apeleaz-o cu argumente poziționale și argumente cu nume amestecate.
Ieșire: program Python complet
def my_function(title, *args, **kwargs):
print("Titlu:", title)
print("Argumente poziționale:", args)
print("Argumente cu nume:", kwargs)
my_function("Informații utilizator", "Emil", "Tobias", age = 25, city = "Oslo")
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 *:
* pentru a despacheta o listă [1, 2, 3] în apelul funcției.
Ieșire: program Python complet
def my_function(a, b, c):
return a + b + c
numbers = [1, 2, 3]
result = my_function(*numbers) # La fel ca: my_function(1, 2, 3)
print(result)
Exemplu
Transformarea unui dicționar în argumente cu nume cu **:
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
def my_function(fname, lname):
print("Salut", fname, lname)
person = {"fname": "Emil", "lname": "Refsnes"}
my_function(**person) # La fel ca: my_function(fname="Emil", lname="Refsnes")