Razširjanje in posredovanje seznamov, nizov in slovarjev kot argumentov funkcij v programu Python

Posel

V Pythonu lahko sezname (polja), kupole in slovarje razširimo (razpakiramo) in njihove elemente skupaj posredujemo kot argumente funkcij.

Ko kličete funkcijo, določite argument z * za sezname in kupole ter ** za slovarje. Upoštevajte število zvezdic *.

Tu so opisane naslednje podrobnosti.

  • razširi (razpakira) seznam ali tuple z * (ena zvezdica)
    • Za funkcije s privzetimi argumenti
    • Za funkcije s spremenljivo dolžino argumentov
  • Razširite (razpakirajte) slovar z ** (dve zvezdici)
    • Za funkcije s privzetimi argumenti
    • Za funkcije s spremenljivo dolžino argumentov

O osnovni uporabi funkcij Python, privzetih argumentih in argumentih spremenljive dolžine z *,** pri definiranju funkcij glejte naslednji članek.

razširi (razpakira) seznam ali tuple z * (ena zvezdica)

Če je seznam ali tuple naveden kot argument z *, se razširi in vsak element se posreduje kot ločen argument.

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

Naslednja razlaga se nanaša na seznam, enako pa velja tudi za tuple.

Če se število elementov ne ujema s številom argumentov, pride do napake 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

Za funkcije s privzetimi argumenti

Če je nastavljen privzeti argument, se ta uporabi, če število elementov ni zadostno. Če je število elementov preveliko, se pojavi napaka 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

Za funkcije s spremenljivo dolžino argumentov

Če je nastavljen argument spremenljive dolžine, se vsi elementi za elementom pozicijskega argumenta posredujejo argumentu spremenljive dolžine.

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')

Razširite (razpakirajte) slovar z ** (dve zvezdici)

Če je kot argument naveden slovar dict s **, se ključi elementov razširijo kot imena argumentov, vrednosti pa kot vrednosti argumentov, pri čemer se vsak od njih posreduje kot ločen argument.

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

Če ni ključa, ki bi se ujemal z imenom argumenta, ali če je ključ, ki se ne ujema, se pojavi napaka 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'

Za funkcije s privzetimi argumenti

Slika, v kateri se posodobijo samo vrednosti imen argumentov, ki se ujemajo s ključi v slovarju.

Ključ, ki se ne ujema z imenom argumenta, povzroči napako 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'

Za funkcije s spremenljivo dolžino argumentov

Če so nastavljeni argumenti s spremenljivo dolžino, se vsak element s ključem, ki ni ime argumenta, določenega kot argument, posreduje argumentu s spremenljivo dolžino.

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