Argumentos de las funciones: *args y **kwargs
abril 09, 2015
Uso de *args y **kwargs¶
La principal diferencia entre *args y **kwargs es que la primera representa una tupla con los elementos en el orden de entrada establecido por la función y **kwargs es un diccionario en dónde las claves tienen igual nombre a los argumentos de la función.
Los nombres args y kwargs son solo convención, estos se pueden renombrar como se desee.
Como entrada de argumentos a una función preestablecida¶
Se define una función sencilla cuyo objetivo es restar dos números. La función resta toma como argumentos de entrada la variable a y la variable b y devuelve el valor de a-b
def resta(a, b):
return a-b
resta(2, 3)
Se puede definir ahora los argumentos de entrada como una tupla o una lista, teniendo en cuenta que importa el orden de estos. El primer valor de args corresponde al valor del primer argumento de la función. Con éste método no importa que nombre tengan los argumentos de la función.
# Tupla como argumento de entrada a la función resta
args = 2, 3
resta(*args)
# Cambiando los valores de los argumentos
args = 3, 2
resta(*args)
# Lista como argumento de entrada a la función resta
args = [3, 2]
resta(*args)
Ahora se definen los argumentos de entrada de la función como un diccionario, en este caso no importa el orden en que se ingresen a este, pero las claves de éste deben tener el mismo nombre que los argumentos de la función.
kwargs = {'b':3, 'a':2}
resta(**kwargs)
# Esto es equivalente a ejecutar resta(2, 3)
Para definir los argumentos de una función¶
Una función definida solo con el argumento *args puede tener cualquier número de argumentos de entrada, incluso ninguno. Dentro de la función se reciben los argumentos como componentes de una tupla.
def pack_area(*args):
print args
pack_area(2,3)
pack_area()
Por ejemplo, se crea una función que suma todos los argumentos, independiente de su valor y de la cantidad de estos
def suma(*args):
# Se convierte la tupla en lista
data = list(args)
return sum(data)
suma(1,14,5,6)
suma()
Una función con solo el argumento **kwargs puede recibir cualquier cantidad de argumentos de entrada, la diferencia con args es que este requiere un nombre para cada argumento que se ingrese a la función. Dentro de la función se reciben todos los argumentos como elementos de un diccionario.
def pack_area(**kwargs):
print kwargs
pack_area(r=2, t=4)
pack_area()
Se crea una función que muestra datos personales
def datos_personales(**kwargs):
for nombre, valor in kwargs.iteritems():
print '{0}: {1}'.format(nombre, valor)
datos_personales(nombre='Andrés', edad=27)
En caso de que se requieran muchos argumentos de entrada se recomienta crear un diccionario
kwargs = {'Nombre': 'Andrés', 'Edad':27, 'Estado civil': 'Soltero'}
datos_personales(**kwargs)
Es posible usar tanto *args como **kwargs en una misma función:
def pack_area(*args, **kwargs):
print args
print kwargs
pack_area(2, 4, 5, c=3, d=4)
2 comments
Muy bueno
ResponderEliminarMuchas gracias, espero haya sido de utilidad.
Eliminar