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 *,**.
- RELATED:Kuidas kasutada ja märkida vaikimisi argumente Pythoni funktsioonides
- RELATED:Kuidas kasutada muutuva pikkusega argumente Pythonis(
*args
,**kwargs
)
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'}