Listák, tuplik és szótárak bővítése és átadása függvényargumentumként Pythonban

Üzleti

A Pythonban a listák (tömbök), tuplik és szótárak kibonthatók (kicsomagolhatók), és a hozzájuk tartozó elemek együtt adhatók át függvényargumentumként.

Egy függvény hívásakor az argumentumot listák és tuplik esetén *-gal, szótárak esetén **-zal kell megadni. Figyeljük meg a csillagok számát *.

A következő részleteket ismertetjük.

  • Egy lista vagy tuple kibővítése (kicsomagolása) *-gal (egy csillag)
    • Alapértelmezett argumentumokkal rendelkező függvények esetén
    • Változó hosszúságú argumentumokkal rendelkező függvények esetén
  • Szótár kibővítése (kicsomagolása) ** (két csillaggal)
    • Alapértelmezett argumentumokkal rendelkező függvények esetén
    • Változó hosszúságú argumentumokkal rendelkező függvények esetén

A Python függvények alapvető használatáról, az alapértelmezett argumentumokról és a függvények definiálásakor a *,** változó hosszúságú argumentumokról lásd a következő cikket.

Egy lista vagy tuple kibővítése (kicsomagolása) *-gal (egy csillag)

Ha egy listát vagy tuple-t adunk meg argumentumként *-mal, akkor az kibontásra kerül, és minden egyes elem külön argumentumként kerül átadásra.

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

A következő magyarázat egy listára vonatkozik, de ugyanez érvényes egy tuple-ra is.

Ha az elemek száma nem egyezik meg az argumentumok számával, TypeError hiba lép fel.

# 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

Alapértelmezett argumentumokkal rendelkező függvények esetén

Ha alapértelmezett argumentum van megadva, az alapértelmezett argumentumot használja a rendszer, ha az elemek száma nem elegendő. Ha az elemek száma túl nagy, TypeError hiba lép fel.

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

Változó hosszúságú argumentumokkal rendelkező függvények esetén

Ha változó hosszúságú argumentum van megadva, akkor a pozicionális argumentum elemét követő összes elemet átadja a változó hosszúságú argumentumnak.

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

Szótár kibővítése (kicsomagolása) ** (két csillaggal)

Ha egy dictionary dict-et adunk meg argumentumként **-val, akkor az elemkulcsok argumentumnévként, az értékek pedig argumentumértékként kerülnek kifejtésre, és mindegyik külön argumentumként kerül átadásra.

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

Ha nincs olyan kulcs, amely megfelel az argumentum nevének, vagy van olyan kulcs, amely nem felel meg, akkor TypeError hiba következik.

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

Alapértelmezett argumentumokkal rendelkező függvények esetén

Kép, amelyben csak a szótár kulcsának megfelelő argumentumnevek értékei frissülnek.

Az argumentum nevével nem egyező kulcs TypeError hibát eredményez.

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'

Változó hosszúságú argumentumokkal rendelkező függvények esetén

Ha változó hosszúságú argumentumok vannak beállítva, akkor minden olyan elem, amelynek kulcsa eltér az argumentumként megadott argumentum nevétől, átkerül a változó hosszúságú argumentumba.

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