Extinderea și trecerea listelor, tulelor și dicționarelor ca argumente ale funcțiilor în Python

Afaceri

Î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.

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'}
Copied title and URL