En Python, las listas (arrays), tuplas y diccionarios pueden expandirse (desempacarse) y sus respectivos elementos pueden pasarse juntos como argumentos de funciones.
Cuando llame a una función, especifique el argumento con * para listas y tuplas y ** para diccionarios. Tenga en cuenta el número de asteriscos *.
Aquí se describen los siguientes detalles.
- Expandir (desempacar) una lista o tupla con * (un asterisco)
- Para las funciones con argumentos por defecto
- Para las funciones con argumentos de longitud variable
- Expandir (desempaquetar) el diccionario con ** (dos asteriscos)
- Para las funciones con argumentos por defecto
- Para las funciones con argumentos de longitud variable
Consulte el siguiente artículo para conocer el uso básico de las funciones de Python, los argumentos por defecto y los argumentos de longitud variable con *,** al definir las funciones.
- RELACIONADO:Cómo utilizar y anotar los argumentos por defecto en las funciones de Python
- RELACIONADO:Cómo utilizar argumentos de longitud variable en Python(
*args
,**kwargs
)
Expandir (desempacar) una lista o tupla con * (un asterisco)
Cuando una lista o tupla se especifica como argumento con *, se expande y cada elemento se pasa como un argumento separado.
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
La siguiente explicación es para una lista, pero lo mismo se aplica a una tupla.
Si el número de elementos no coincide con el número de argumentos, se produce 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
Para las funciones con argumentos por defecto
Si se establece un argumento por defecto, éste se utiliza si el número de elementos es insuficiente. Si el número de elementos es demasiado grande, se produce 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
Para las funciones con argumentos de longitud variable
Si se establece un argumento de longitud variable, todos los elementos después del elemento para el argumento posicional se pasan al argumento 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')
Expandir (desempaquetar) el diccionario con ** (dos asteriscos)
Cuando se especifica un diccionario dict como argumento con **, las claves de los elementos se expanden como nombres de argumento y los valores como valores de argumento, y cada uno se pasa como un argumento separado.
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 hay ninguna clave que coincida con el nombre del argumento o hay una clave que no coincide, se producirá 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'
Para las funciones con argumentos por defecto
Imagen en la que sólo se actualizan los valores de los nombres de los argumentos que coinciden con las claves del diccionario.
Una clave que no coincida con el nombre del argumento dará lugar 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'
Para las funciones con argumentos de longitud variable
Si se establecen argumentos de longitud variable, cualquier elemento con una clave distinta del nombre del argumento especificado como argumento se pasa al argumento 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'}