Expandir i passar llistes, tuples i diccionaris com a arguments de funció a Python

Negocis

A Python, les llistes (matrius), les tuples i els diccionaris es poden expandir (descomprimir) i els seus respectius elements es poden passar junts com a arguments de funció.

Quan crideu una funció, especifiqueu l’argument amb * per a llistes i tuples i ** per als diccionaris. Tingueu en compte el nombre d’asteriscs *.

Els detalls següents es descriuen aquí.

  • Amplieu (descomprimiu) una llista o una tupla amb * (un asterisc)
    • Per a funcions amb arguments per defecte
    • Per a funcions amb arguments de longitud variable
  • Amplieu (descomprimiu) el diccionari amb ** (dos asteriscs)
    • Per a funcions amb arguments per defecte
    • Per a funcions amb arguments de longitud variable

Consulteu l’article següent per a l’ús bàsic de les funcions de Python, els arguments predeterminats i els arguments de longitud variable amb *,** quan es defineixen funcions.

Amplieu (descomprimiu) una llista o una tupla amb * (un asterisc)

Quan s’especifica una llista o tupla com a argument amb *, s’amplia i cada element es passa com un argument independent.

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

L’explicació següent és per a una llista, però el mateix s’aplica a una tupla.

Si el nombre d’elements no coincideix amb el nombre d’arguments, es produeix un error TypeError.

# 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

Per a funcions amb arguments per defecte

Si s’estableix un argument per defecte, s’utilitza l’argument per defecte si el nombre d’elements és insuficient. Si el nombre d’elements és massa gran, es produeix un error TypeError.

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

Per a funcions amb arguments de longitud variable

Si s’estableix un argument de longitud variable, tots els elements després de l’element de l’argument posicional es passen a l’argument de longitud variable.

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

Amplieu (descomprimiu) el diccionari amb ** (dos asteriscs)

Quan s’especifica un diccionari de diccionari com a argument amb **, les claus d’element s’amplien com a noms d’argument i els valors com a valors d’argument, i cadascun es passa com a argument independent.

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

Si no hi ha cap clau que coincideixi amb el nom de l’argument o hi ha una clau que no coincideix, es produirà un error TypeError.

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

Per a funcions amb arguments per defecte

Imatge en què només s’actualitzen els valors dels noms dels arguments que coincideixen amb les claus del diccionari.

Una clau que no coincideix amb el nom de l’argument donarà lloc a un error TypeError.

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'

Per a funcions amb arguments de longitud variable

Si s’estableixen arguments de longitud variable, qualsevol element amb una clau diferent del nom de l’argument especificat com a argument es passa a l’argument de longitud variable.

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