MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Î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
← Lecția anterioară Lecția următoare →