Udvidelse og videregivelse af lister, tupler og ordbøger som funktionsargumenter i Python

Forretning

I Python kan lister (arrays), tupler og ordbøger udvides (udpakkes), og deres respektive elementer kan sendes sammen som funktionsargumenter.

Når du kalder en funktion, skal du angive argumentet med * for lister og tupler og ** for ordbøger. Bemærk antallet af stjernetegn *.

Følgende oplysninger beskrives her.

  • Udvid (udpakning) af en liste eller tupel med * (en stjerne)
    • For funktioner med standardargumenter
    • For funktioner med argumenter af variabel længde
  • Udvid (udpak) ordbogen med ** (to stjerner)
    • For funktioner med standardargumenter
    • For funktioner med argumenter af variabel længde

Se følgende artikel om grundlæggende brug af Python-funktioner, standardargumenter og argumenter med variabel længde med *,**, når du definerer funktioner.

Udvid (udpakning) af en liste eller tupel med * (en stjerne)

Når en liste eller tupel angives som et argument med *, udvides den, og hvert element overføres som et separat 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

Den følgende forklaring gælder for en liste, men det samme gælder for en tupel.

Hvis antallet af elementer ikke stemmer overens med antallet af argumenter, opstår en TypeError-fejl.

# 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

For funktioner med standardargumenter

Hvis der er angivet et standardargument, anvendes standardargumentet, hvis antallet af elementer er utilstrækkeligt. Hvis antallet af elementer er for stort, opstår der en TypeError-fejl.

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

For funktioner med argumenter af variabel længde

Hvis der er angivet et argument med variabel længde, overføres alle elementer efter elementet for det positionelle argument til argumentet med variabel længde.

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

Udvid (udpak) ordbogen med ** (to stjerner)

Når en ordbog dict angives som et argument med **, udvides elementnøglerne som argumentnavne og værdierne som argumentværdier, og hver af dem overføres som et separat 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

Hvis der ikke er nogen nøgle, der passer til argumentnavnet, eller hvis der er en nøgle, der ikke passer, opstår der en TypeError-fejl.

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

For funktioner med standardargumenter

Billede, hvor kun de værdier af argumentnavne, der passer til nøglerne i ordbogen, opdateres.

En nøgle, der ikke svarer til argumentnavnet, vil resultere i en TypeError-fejl.

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'

For funktioner med argumenter af variabel længde

Hvis der er angivet argumenter med variabel længde, overføres ethvert element med en anden nøgle end det argumentnavn, der er angivet som argument, til argumentet med variabel længde.

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