Expandera och skicka listor, tupler och ordlistor som funktionsargument i Python

Företag

I Python kan listor (arrayer), tupler och ordlistor expanderas (packas upp) och deras respektive element kan skickas tillsammans som funktionsargument.

När du anropar en funktion ska du ange argumentet med * för listor och tupler och ** för ordlistor. Observera antalet asterisker *.

Här beskrivs följande detaljer.

  • Expandera (packa upp) en lista eller tupel med * (en asterisk)
    • För funktioner med standardargument
    • För funktioner med argument med variabel längd
  • Expandera (packa upp) ordboken med ** (två asterisker)
    • För funktioner med standardargument
    • För funktioner med argument med variabel längd

I följande artikel beskrivs grundläggande användning av Python-funktioner, standardargument och argument med variabla längder med *,** när du definierar funktioner.

Expandera (packa upp) en lista eller tupel med * (en asterisk)

När en lista eller tupel anges som argument med * expanderas den och varje element skickas som ett 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

Följande förklaring gäller en lista, men samma sak gäller för en tupel.

Om antalet element inte stämmer överens med antalet argument uppstår ett TypeError-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

För funktioner med standardargument

Om ett standardargument har angetts används standardargumentet om antalet element inte är tillräckligt. Om antalet element är för stort uppstår ett TypeError-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

För funktioner med argument med variabel längd

Om ett argument med variabel längd har angetts skickas alla element efter elementet för positionsargumentet till argumentet med variabel längd.

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

Expandera (packa upp) ordboken med ** (två asterisker)

När en dictionary dict anges som ett argument med ** expanderas elementnycklarna som argumentnamn och värdena som argumentvärden, och varje element skickas som ett 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

Om det inte finns någon nyckel som matchar argumentets namn eller om det finns en nyckel som inte matchar, uppstår ett TypeError-fel.

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

För funktioner med standardargument

Bild där endast de värden för argumentnamn som matchar nycklarna i ordlistan uppdateras.

En nyckel som inte matchar argumentets namn resulterar i ett TypeError-fel.

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'

För funktioner med argument med variabel längd

Om argument med variabel längd är inställda skickas alla element med en annan nyckel än det argumentnamn som anges som argumentet till argumentet med variabel längd.

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