Al definir una función, los parametros definen la cantidad de argumentos que esta puede aceptar al ser llamada.
Sin embargo, al programar una función, no siempre es posible predecir todos los escenarios en que puede llegar a utilizarse, implicando también que desconocemos la cantidad de argumentos que puede llegar a recibir.
Para estos casos, utilizaremos *args y **kwargs en nuestro código, que nos permiten aceptar un número indeterminado de argumentos para nuestra función.
Uso de *args en Python 3
En python *args (con un solo asterisco) es utilizado como parametro para recibir argumentos sin palabras clave en nuestra función. Es importante notar que la parte importante de la sentencia es el asterisco (*), mientras que la palabra args puede variar.
Por ejemplo, una función suma() convencional en Python luce así:
https://gist.github.com/Nxz02/539984ee526ec9da0499c3e3f8f19515
Salida:
suma(1,2) Resultado: 3
Sin embargo, la función anterior nos limita únicamente a dos sumandos, y para poder añadir más, sería necesario definir más parametros. Si queremos hacer una función suma() que reciba un número indeterminado de argumentos sin nombre, utilizaremos *args como parametro.
Al utilizar el parametro *args, los argumentos serán recibidos por la función como una tupla, por lo que requeriremos iterar sobre ellos para realizar la suma, la nueva función suma() quedaría así:
https://gist.github.com/Nxz02/349b367de7e8e8900a2b127944204815
Salida:
suma(1,2,3,4) Resultado: 10
De esta forma, la función realizará la operación sin importar cuantos argumentos reciba.
Como *args crea una tupla con los argumentos de la función, podemos pasar cualquier tupla a la función añadiendo un asterisco (*) antes de su nombre, y la función tomará el contenido de la tupla como parametros, por ejemplo, con la función anterior:
Salida:
sumandos = (10, 20, 30, 40, 50) suma(*sumandos) Resultado: 150
Uso de **kwargs en Python 3
Cuando usamos dos asteriscos en **kwargs (Keyword Arguments), la función recibe los argumentos como un diccionario, por lo que es necesario especificar el nombre del argumento y su valor.
Por ejemplo, la siguiente función que imprime una lista de nombres:
https://gist.github.com/anonymous/d6064888d5e41c0aa89e26bf355dc593
Salida:
nombres(nombre1 = "Python", nombre2 = "Guido", nombre3 = "Usb") Nombre 1 Guido Nombre 2 Usb Nombre 3 Python
De igual forma que podemos pasar cualquier tupla a cualquier función con *args, podemos pasar cualquier diccionar a cualquier función que acepter **kwargs tan sólo añadiendo dos astericos como prefijo al pasar el diccionario como argumento:
Salida:
personas = {'nombre1':'Alan', 'nombre2':'Dennis', 'nombre3':'John'} nombres(**personas) Nombre 1 Dennis Nombre 2 John Nombre 3 Alan
Dependiendo de la versión de Python que utilices, los diccionarios pueden ser una estructura de datos ordenada (Python 3.6 o superior) o desordenada (Python 3.5 e inferior).
Deja una respuesta