În Python, listele (array-uri), tuplurile și dicționarele pot fi expandate (despachetate), iar elementele lor respective pot fi transmise împreună ca argumente pentru funcții.
Atunci când apelați o funcție, specificați argumentul cu * pentru liste și tule și ** pentru dicționare. Rețineți numărul de asteriscuri *.
Aici sunt descrise următoarele detalii.
- Extindeți (despachetați) o listă sau un tupluplu cu * (un asterisc)
- Pentru funcțiile cu argumente implicite
- Pentru funcțiile cu argumente de lungime variabilă
- Extindeți (despachetați) dicționarul cu ** (două asteriscuri)
- Pentru funcțiile cu argumente implicite
- Pentru funcțiile cu argumente de lungime variabilă
Consultați următorul articol pentru utilizarea de bază a funcțiilor Python, a argumentelor implicite și a argumentelor de lungime variabilă cu *,** la definirea funcțiilor.
- RELAȚIE:Cum să folosiți și să notați argumentele implicite în funcțiile Python
- RELAȚIE:Cum să folosiți argumente de lungime variabilă în Python(
*args
,**kwargs
)
Extindeți (despachetați) o listă sau un tupluplu cu * (un asterisc)
Atunci când o listă sau un tupluplu este specificat ca argument cu *, acesta este extins și fiecare element este transmis ca argument separat.
def func(arg1, arg2, arg3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
l = ['one', 'two', 'three']
func(*l)
# arg1 = one
# arg2 = two
# arg3 = three
func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three
t = ('one', 'two', 'three')
func(*t)
# arg1 = one
# arg2 = two
# arg3 = three
func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three
Explicația următoare se referă la o listă, dar același lucru este valabil și pentru un tuple.
În cazul în care numărul de elemente nu corespunde numărului de argumente, apare o eroare TypeError.
# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'
# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given
Pentru funcțiile cu argumente implicite
În cazul în care se stabilește un argument implicit, acesta este utilizat dacă numărul de elemente este insuficient. În cazul în care numărul de elemente este prea mare, apare o eroare de tip TypeError.
def func_default(arg1=1, arg2=2, arg3=3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3
func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3
# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given
Pentru funcțiile cu argumente de lungime variabilă
Dacă este setat un argument de lungime variabilă, toate elementele de după elementul pentru argumentul pozițional sunt transmise la argumentul de lungime variabilă.
def func_args(arg1, *args):
print('arg1 =', arg1)
print('args =', args)
func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)
func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')
func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')
Extindeți (despachetați) dicționarul cu ** (două asteriscuri)
Atunci când un dicționar dict este specificat ca argument cu **, cheile elementelor sunt extinse ca nume de argument și valorile ca valori de argument, iar fiecare este transmis ca argument separat.
def func(arg1, arg2, arg3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}
func(**d)
# arg1 = one
# arg2 = two
# arg3 = three
func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three
Dacă nu există nicio cheie care să corespundă numelui argumentului sau dacă există o cheie care nu se potrivește, se va produce o eroare TypeError.
# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'
# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'
Pentru funcțiile cu argumente implicite
Imagine în care sunt actualizate numai valorile numelor de argumente care corespund cheilor din dicționar.
O cheie care nu se potrivește cu numele argumentului va avea ca rezultat o eroare TypeError.
def func_default(arg1=1, arg2=2, arg3=3):
print('arg1 =', arg1)
print('arg2 =', arg2)
print('arg3 =', arg3)
func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3
func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three
# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'
Pentru funcțiile cu argumente de lungime variabilă
În cazul în care sunt setate argumente de lungime variabilă, orice element cu o cheie diferită de numele argumentului specificat ca argument este transmis la argumentul de lungime variabilă.
def func_kwargs(arg1, **kwargs):
print('arg1 =', arg1)
print('kwargs =', kwargs)
func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}
func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}
func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}