Uso de *args y **kwargs en funciones de Python

Clase 51 de 63Curso de Python

Resumen

¿Qué son los args y kwargs y cómo te ayudan en programación?

En el mundo de la programación, especialmente cuando trabajamos con funciones, nos encontramos con situaciones donde la cantidad de argumentos que vamos a recibir es incierta. Aquí es donde los args y kwargs se convierten en aliados indispensables. Estos mecanismos permiten manejar un número variable de argumentos o parámetros, otorgando flexibilidad y dinamismo a las funciones que creamos.

¿Cómo usar *args para argumentos variables?

*args es una herramienta que se utiliza para recibir un número indefinido de argumentos. En Python, cuando definimos una función y le precedemos de un asterisco *, indicamos que estamos listos para recibir múltiples argumentos.

def sum_numbers(*args): return sum(args) # Llamada a la función con diferentes números de argumentos print(sum_numbers(1, 2, 3, 4, 5)) # Retorna 15 print(sum_numbers(1, 2)) # Retorna 3 print(sum_numbers(7, 8, 9, 10)) # Retorna 34

Consideraciones:

  • Los args se almacenan en una tupla inmutable.
  • Este método es ideal cuando no se conoce de antemano la cantidad de argumentos que la función recibirá.

¿Cómo manejar argumentos con **kwargs?

Cuando se requiere trabajar con argumentos que poseen etiquetas (es decir, pares de llave y valor), el método adecuado es **kwargs. Al anteponer dos asteriscos ** a nuestra variable, indicamos que estamos preparados para recibir argumentos con nombre.

def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") # Llamada a la función con diferentes argumentos print_info(name="Carlos", age=30, city="Bogotá") # Salida: # name: Carlos # age: 30 # city: Bogotá

Detalles importantes:

  • kwargs se almacena como un diccionario.
  • Ofrece flexibilidad para gestionar múltiples parámetros y modificarlos sin alterar la estructura de la función.

¿Cómo combinar args y kwargs en clases?

En programación orientada a objetos, también es posible emplear args y kwargs, especialmente para ofrecer flexibilidad en la inicialización de clases.

class Empleado: def __init__(self, name, *skills, **details): self.name = name self.skills = skills self.details = details def show_info(self): print(f"Name: {self.name}") print(f"Skills: {self.skills}") print(f"Details: {self.details}") # Creación de un objeto e instancia de la clase empleado = Empleado("Carlos", "Python", "Java", "C++", age=30, city="Bogotá") empleado.show_info()

¿Qué es el desempaquetado y cuándo usarlo?

El desempaquetado permite extraer valores de listas o diccionarios y pasarlos a una función sin tener que especificar cada valor individualmente. Esto puede realizarse tanto con args (usando *) como con kwargs (usando **).

def suma(a, b, c): return a + b + c # Desempaquetado de lista valores = [1, 2, 3] print(suma(*valores)) # Retorna 6 def mostrar_informacion(name, age): print(f"Name: {name}, Age: {age}") # Desempaquetado de diccionario datos = {'name': 'Carlos', 'age': 30} mostrar_informacion(**datos)

Conclusiones y práctica recomendada

Para llevar a la práctica estos conceptos, te sugerimos crear funciones que puedan recibir listas de precios y descuentos aplicables usando *args y **kwargs. La clave está en discernir cuándo es necesario un enfoque u otro y cómo podemos sacar provecho del dinamismo que ofrecen estos mecanismos.

La programación con args y kwargs no solo ofrece mayor flexibilidad, sino que también mejora la legibilidad y eficiencia de nuestro código. Anímate a continuar explorando estos conceptos y aplicarlos en tus proyectos diarios.