Împachetarea și despachetarea în parametrii funcțiilor
Una dintre utilizările comune ale împachetării și despachetării este în parametrii funcțiilor. Astfel, în definițiile diferitelor funcții, este frecvent să vedem că ele acceptă parametri precum *args și **kwargs.
Termenii args și kwargs sunt convenții de programare în Python; în realitate, în locul lor pot fi utilizate orice denumiri. *args reprezintă parametrii care sunt transmiși pe poziție, în timp ce **kwargs se referă la parametrii transmiși pe nume.
Operatorul * poate fi utilizat cu orice obiect iterabil (de exemplu, tupluri, liste și șiruri de caractere), în timp ce operatorul ** poate fi utilizat doar cu dicționare.
*args
Operatorul * permite transmiterea mai multor valori într-o funcție, iar toate vor fi împachetate într-un tuplu:
def fun(*args):
# accesăm primul element al tuplului
print(args[0])
# afișăm întregul tuplu
print(args)
fun("Python", "C++", "Java", "C#")
Aici, funcția fun acceptă un tuplu de valori. La apelare, putem transmite un număr variabil de valori. În exemplul de mai sus, sunt transmise patru șiruri de caractere, care formează un tuplu. Ieșirea în consolă a programului:
Python
('Python', 'C++', 'Java', 'C#')
Datorită acestei capacități, putem transmite un număr variabil de valori într-o funcție:
def sum(*args):
result = 0
for arg in args:
result += arg
return result
print(sum(1, 2, 3)) # 6
print(sum(1, 2, 3, 4)) # 10
print(sum(1, 2, 3, 4, 5)) # 15
**kwargs
Operatorul ** împachetează argumentele transmise pe nume într-un dicționar. Numele parametrilor devin chei. De exemplu, să definim o funcție care doar va afișa toți parametrii transmiși:
def fun(**kwargs):
print(kwargs) # afișăm dicționarul în consolă
fun(name="Tom", age="38", company="Google")
fun(language="Python", version="3.11")
Ieșirea în consolă a programului:
{'name': 'Tom', 'age': '38', 'company': 'Google'}
{'language': 'Python', 'version': '3.11'}
Deoarece argumentele sunt transmise funcției sub formă de dicționar, putem accesa valorile lor în interiorul funcției prin chei:
def fun(**kwargs):
for key in kwargs:
print(f"{key} = {kwargs[key]}")
fun(name="Tom", age="38", company="Google")
Ieșirea în consolă a programului:
name = Tom
age = 38
company = Google
Despachetarea argumentelor
Mai sus am descris cum operatorii * și ** sunt utilizați pentru împachetarea argumentelor într-un tuplu și dicționar, respectiv. Dar aceiași operatori pot fi folosiți și pentru despachetare.
Operatorul * și despachetarea
Să analizăm mai întâi o situație unde acest lucru poate fi util. Să presupunem că transmitem un tuplu într-o funcție:
def sum(*args):
result = 0
for arg in args:
result += arg
return result
numbers = (1, 2, 3, 4, 5)
print(sum(numbers))
Aici, tuplul numbers este transmis funcției sum. Parametrul *args, de asemenea, reprezintă un tuplu, și pare că totul ar trebui să funcționeze. Cu toate acestea, vom întâmpina o eroare:
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
În acest caz, tuplul numbers este transmis ca element al tuplului *args.
Pentru ca elementele tuplului să fie transmise în tuplul *args ca valori separate, trebuie să efectuăm despachetarea acestora:
def sum(*args):
result = 0
for arg in args:
result += arg
return result
numbers = (1, 2, 3, 4, 5)
# aplicăm despachetarea - *numbers
print(sum(*numbers)) # 15
Aici, la transmiterea tuplului numbers în funcția sum, se aplică despachetarea: *numbers
Un alt caz de despachetare poate fi situația în care funcția acceptă mai mulți parametri, iar noi transmitem un singur tuplu sau listă:
def print_person(name, age, company):
print(f"Name:{name}, Age: {age}, Company: {company}")
person =("Tom", 38, "Google")
# efectuăm despachetarea tuplului person
print_person(*person) # Name:Tom, Age: 38, Company: Google
În acest caz, expresia *person despachetează tuplul person în valori separate, care sunt transmise parametrilor name, age și company.
Operatorul ** și despachetarea
Operatorul ** este utilizat pentru despachetarea dicționarelor:
def print_person(name, age, company):
print(f"Name:{name}, Age: {age}, Company: {company}")
tom ={"name":"Tom", "age":38, "company":"Google"}
# efectuăm despachetarea dicționarului tom
print_person(**tom) # Name:Tom, Age: 38, Company: Google
Aici, expresia **tom despachetează dicționarul în valori separate, care sunt transmise parametrilor name, age și company pe baza numelor cheilor.
Combinarea parametrilor
Parametrii *args și **kwargs pot fi utilizați împreună cu alți parametri într-o funcție. De exemplu:
def sum(num1, num2, *nums):
result=num1+num2
for n in nums:
result += n
return result
print(sum(1,2,3)) # 6
print(sum(1,2,3,4)) # 10