Luetteloiden, tuplien ja sanakirjojen laajentaminen ja siirtäminen funktion argumentteina Pythonissa.

liiketoiminta

Pythonissa luettelot (matriisit), tuplet ja sanakirjat voidaan laajentaa (purkaa) ja niiden elementit voidaan välittää yhdessä funktion argumentteina.

Kun kutsut funktiota, määritä argumentti *:lla, kun kyseessä ovat listat ja tuplet, ja **:lla, kun kyseessä ovat sanakirjat. Huomaa tähtien määrä *.

Tässä kuvataan seuraavat yksityiskohdat.

  • Laajenna (purkaa) lista tai tuple *:lla (yksi tähti).
    • Funktioille, joilla on oletusargumentit
    • Funktioille, joiden argumentit ovat muuttuvan pituisia
  • Laajenna (purkaa) sanakirja **:lla (kaksi tähteä).
    • Funktioille, joilla on oletusargumentit
    • Funktioille, joiden argumentit ovat muuttuvan pituisia

Katso seuraavasta artikkelista Python-funktioiden peruskäyttö, oletusargumentit ja muuttuvan pituiset argumentit *,**:llä funktioita määriteltäessä.

Laajenna (purkaa) lista tai tuple *:lla (yksi tähti).

Kun listaa tai monikkoa määritetään argumenttina *-merkillä, se laajennetaan ja jokainen elementti välitetään erillisenä argumenttina.

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

Seuraava selitys koskee listaa, mutta sama pätee myös tupleen.

Jos elementtien lukumäärä ei vastaa argumenttien lukumäärää, syntyy TypeError-virhe.

# 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

Funktioille, joilla on oletusargumentit

Jos oletusargumentti on asetettu, oletusargumenttia käytetään, jos elementtien määrä ei ole riittävä. Jos elementtien määrä on liian suuri, syntyy TypeError-virhe.

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

Funktioille, joiden argumentit ovat muuttuvan pituisia

Jos asetetaan muuttuvan pituinen argumentti, kaikki sijaintiargumentin elementin jälkeiset elementit siirretään muuttuvan pituiseen argumenttiin.

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

Laajenna (purkaa) sanakirja **:lla (kaksi tähteä).

Kun sanakirjan dict määritetään argumenttina **:n kanssa, elementtien avaimet laajennetaan argumentin nimiksi ja arvot argumentin arvoiksi, ja kukin niistä välitetään erillisenä argumenttina.

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

Jos argumentin nimeä vastaavaa avainta ei ole tai jos on olemassa avain, joka ei vastaa argumentin nimeä, tuloksena on TypeError-virhe.

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

Funktioille, joilla on oletusargumentit

Kuva, jossa päivitetään vain ne argumenttien nimien arvot, jotka vastaavat sanakirjan avaimia.

Avain, joka ei vastaa argumentin nimeä, aiheuttaa TypeError-virheen.

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'

Funktioille, joiden argumentit ovat muuttuvan pituisia

Jos muuttujapituiset argumentit on asetettu, kaikki elementit, joiden avain on muu kuin argumenttina määritetyn argumentin nimi, siirretään muuttujapituiseen argumenttiin.

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