Proširivanje i prosljeđivanje popisa, tuple i rječnika kao argumenata funkcije u Pythonu

Poslovanje

U Pythonu se popisi (nizovi), tuple i rječnici mogu proširiti (raspakirati) i njihovi odgovarajući elementi mogu se proslijediti zajedno kao argumenti funkcije.

Prilikom pozivanja funkcije navedite argument s * za popise i torke i ** za rječnike. Obratite pažnju na broj zvjezdica *.

Ovdje su opisani sljedeći detalji.

  • Proširite (otpakirajte) popis ili tuple sa * (jedna zvjezdica)
    • Za funkcije sa zadanim argumentima
    • Za funkcije s argumentima promjenjive duljine
  • Proširite (otpakirajte) rječnik s ** (dvije zvjezdice)
    • Za funkcije sa zadanim argumentima
    • Za funkcije s argumentima promjenjive duljine

Pogledajte sljedeći članak za osnovnu upotrebu Python funkcija, zadanih argumenata i argumenata promjenjive duljine sa *,** prilikom definiranja funkcija.

Proširite (otpakirajte) popis ili tuple sa * (jedna zvjezdica)

Kada je popis ili tuple specificiran kao argument sa *, on se proširuje i svaki element se prosljeđuje kao poseban 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

Sljedeće objašnjenje je za popis, ali isto vrijedi i za tuple.

Ako broj elemenata ne odgovara broju argumenata, dolazi do pogreške 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 sa zadanim argumentima

Ako je postavljen zadani argument, zadani se argument koristi ako je broj elemenata nedovoljan. Ako je broj elemenata prevelik, dolazi do pogreške 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 argumentima promjenjive duljine

Ako je postavljen argument promjenjive duljine, svi elementi nakon elementa za pozicijski argument prosljeđuju se argumentu varijabilne duljine.

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

Proširite (otpakirajte) rječnik s ** (dvije zvjezdice)

Kada je rječnik dict naveden kao argument s **, ključevi elementa se proširuju kao imena argumenata i vrijednosti kao vrijednosti argumenata, a svaki se prosljeđuje kao zasebni 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

Ako ne postoji ključ koji odgovara imenu argumenta ili postoji ključ koji se ne podudara, pojavit će se pogreška 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 sa zadanim argumentima

Slika u kojoj se ažuriraju samo vrijednosti naziva argumenata koji odgovaraju ključevima u rječniku.

Ključ koji ne odgovara imenu argumenta rezultirat će pogreškom 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 argumentima promjenjive duljine

Ako su postavljeni argumenti varijabilne duljine, bilo koji element s ključem koji nije naveden kao argument prosljeđuje se argumentu varijabilne duljine.

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