Argumentos de las funciones: *args y **kwargs

abril 09, 2015

args y kwargs

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

In [1]:
def resta(a, b):
    return a-b

resta(2, 3)
Out[1]:
-1

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.

In [2]:
# Tupla como argumento de entrada a la función resta
args = 2, 3
resta(*args)
Out[2]:
-1
In [3]:
# Cambiando los valores de los argumentos
args = 3, 2 
resta(*args)
Out[3]:
1
In [4]:
# Lista como argumento de entrada a la función resta
args = [3, 2] 
resta(*args)
Out[4]:
1

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.

In [5]:
kwargs = {'b':3, 'a':2}
resta(**kwargs)

# Esto es equivalente a ejecutar resta(2, 3)
Out[5]:
-1

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.

In [6]:
def pack_area(*args):
    print args

pack_area(2,3)
pack_area()
(2, 3)
()

Por ejemplo, se crea una función que suma todos los argumentos, independiente de su valor y de la cantidad de estos

In [7]:
def suma(*args):
    # Se convierte la tupla en lista
    data = list(args)
    return sum(data)
In [8]:
suma(1,14,5,6)
Out[8]:
26
In [9]:
suma()
Out[9]:
0

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.

In [10]:
def pack_area(**kwargs):
    print kwargs

pack_area(r=2, t=4)
pack_area()
{'r': 2, 't': 4}
{}

Se crea una función que muestra datos personales

In [11]:
def datos_personales(**kwargs):
    for nombre, valor in kwargs.iteritems():
        print '{0}: {1}'.format(nombre, valor)
In [12]:
datos_personales(nombre='Andrés', edad=27)
edad: 27
nombre: Andrés

En caso de que se requieran muchos argumentos de entrada se recomienta crear un diccionario

In [13]:
kwargs = {'Nombre': 'Andrés', 'Edad':27, 'Estado civil': 'Soltero'}
datos_personales(**kwargs)
Edad: 27
Nombre: Andrés
Estado civil: Soltero

Es posible usar tanto *args como **kwargs en una misma función:

In [14]:
def pack_area(*args, **kwargs):
    print args
    print kwargs

pack_area(2, 4, 5, c=3, d=4)
(2, 4, 5)
{'c': 3, 'd': 4}

You Might Also Like

2 comments

Apoyado por: