Nimekirjade, tuplite ja sõnastike laiendamine ja edastamine funktsioonide argumentidena Pythonis

Äri

Pythonis saab loendeid (massiive), tupleid ja sõnastikke laiendada (lahtipakendada) ja nende vastavaid elemente koos funktsioonide argumentidena edastada.

Funktsiooni kutsumisel täpsustage argumendiks * loendite ja tuplite puhul ning ** sõnastike puhul. Pange tähele tärnide arvu *.

Siin on kirjeldatud järgmisi üksikasju.

  • Laiendada (lahtipakendada) loendit või tuplit *-ga (üks tärn)
    • Vaikimisi argumentidega funktsioonide puhul
    • Muutuva pikkusega argumentidega funktsioonide puhul
  • Laiendada (lahtipakkida) sõnastik ** (kaks tärni)
    • Vaikimisi argumentidega funktsioonide puhul
    • Muutuva pikkusega argumentidega funktsioonide puhul

Pythoni funktsioonide, vaikimisi argumentide ja muutuva pikkusega argumentide põhikasutuse kohta funktsioonide defineerimisel vt järgmist artiklit *,**.

Laiendada (lahtipakendada) loendit või tuplit *-ga (üks tärn)

Kui loendi või tupli argumendiks on määratud *, laiendatakse see ja iga element antakse üle eraldi argumendina.

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

Järgnev selgitus on loendi kohta, kuid sama kehtib ka tupli kohta.

Kui elementide arv ei vasta argumentide arvule, tekib TypeError-viga.

# 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

Vaikimisi argumentidega funktsioonide puhul

Kui vaikimisi argument on määratud, kasutatakse vaikimisi argumenti, kui elementide arv on ebapiisav. Kui elementide arv on liiga suur, tekib TypeError-viga.

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

Muutuva pikkusega argumentidega funktsioonide puhul

Kui on määratud muutuva pikkusega argument, siis kõik elemendid pärast positsioonilise argumendi elementi edastatakse muutuva pikkusega argumendile.

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

Laiendada (lahtipakkida) sõnastik ** (kaks tärni)

Kui sõnastiku dict on esitatud argumendina koos **-ga, laiendatakse elemendi võtmed argumendi nimedeks ja väärtused argumendi väärtusteks ning igaüks neist edastatakse eraldi argumendina.

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

Kui argumenti nimele vastavat võtit ei ole või kui on olemas võti, mis ei vasta, tekib TypeError-viga.

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

Vaikimisi argumentidega funktsioonide puhul

Pilt, milles ajakohastatakse ainult nende argumentide nimede väärtusi, mis vastavad sõnaraamatu võtmetele.

Võtme puhul, mis ei vasta argumendi nimele, tekib TypeError-viga.

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'

Muutuva pikkusega argumentidega funktsioonide puhul

Kui on määratud muutuva pikkusega argumendid, siis kõik elemendid, mille võti on muu kui argumendina määratud argumendi nimi, antakse üle muutuva pikkusega argumendile.

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