Saltar al contenido principal
eLearner.app
Módulo 5 · Lección 3 de 419/36 en el curso~12 min
Lecciones del módulo (3/4)

*args y **kwargs

A veces quieres que una función acepte un número variable de argumentos. Python te ofrece dos herramientas: *args (recopila argumentos posicionales en una tupla) y **kwargs (recopila argumentos de palabras clave en un diccionario).

*args: argumentos posicionales variables

Python
def somma_tutto(*nums):
    totale = 0
    for n in nums:
        totale += n
    return totale

somma_tutto(1, 2, 3)         # 6
somma_tutto(1, 2, 3, 4, 5)   # 15
somma_tutto()                # 0

Dentro de la función, nums es una tupla con todos los valores pasados. El nombre es solo una convención: *args es el más común, pero *nums o *valori son perfectamente válidos.

**kwargs: argumentos de palabras clave variables

Python
def crea_config(**opzioni):
    return opzioni

crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}

Dentro de la función, opzioni es un diccionario con {param_name: value}.

Combinando todo

El orden fijo es: **parámetros regulares, *args, parámetros por defecto, **kwargs**.

Python
def f(primo, *args, opzione="x", **kwargs):
    print(primo, args, opzione, kwargs)

f(1, 2, 3, opzione="y", extra=10)
# 1 (2, 3) y {'extra': 10}

Desempaquetado en la llamada: * y **

El mismo operador funciona al revés: para "hacer explotar" una lista/tupla en argumentos posicionales o un diccionario en argumentos de palabras clave.

Python
def punto(x, y, z):
    return (x, y, z)

coords = [1, 2, 3]
punto(*coords)        # punto(1, 2, 3)  →  (1, 2, 3)

opts = {"x": 1, "y": 2, "z": 3}
punto(**opts)         # punto(x=1, y=2, z=3)

Patrón Wrapper

Python
def log_chiamata(fn, *args, **kwargs):
    print(f"chiamo {fn.__name__} con {args=} {kwargs=}")
    return fn(*args, **kwargs)

log_chiamata(max, 3, 1, 2)             # calls max(3, 1, 2)
log_chiamata(sorted, [3, 1, 2], reverse=True)

Orden de parámetros en las firmas de funciones

Al definir una función que acepta múltiples tipos de argumentos, debes adherirte a un orden estricto en la firma:

  1. Parámetros posicionales estándar.
  2. Varargs posicionales *args.
  3. Parámetros de palabras clave con valores por defecto.
  4. Varargs de palabras clave **kwargs.

Pruébalo tú

Ejercicio#python.m5.l3.e1
Intentos: 0Cargando...

Define `average(*nums)` que devuelva la media aritmética (suma / cantidad). Llámala con 10, 20, 30 y asigna el resultado a `m`. Evalúa `m`.

Cargando editor...
Mostrar pista

sum(nums) / len(nums)

Solución disponible después de 3 intentos

Ejercicio de repaso

Ejercicio#python.m5.l3.e2
Intentos: 0Cargando...

Dada la función `def point(x, y, z): return x + y + z` y el diccionario `coords = {'x': 1, 'y': 2, 'z': 3}`, llama a point desempaquetando coords y asigna el resultado a `s`. Evalúa `s`.

Cargando editor...
Mostrar pista

point(**coords)

Solución disponible después de 3 intentos

Desafío adicional

Ejercicio#python.m5.l3.e3
Intentos: 0Cargando...

Escribe una función `multiply_all(*args)` que devuelva el producto de todos los números pasados como argumentos. Si no se pasan argumentos, debería devolver `1`. Finalmente, evalúa la llamada `multiply_all(2, 3, 4)`.

Cargando editor...
Mostrar pista

Usa un bucle for para iterar sobre los elementos en args y acumular su producto.

Solución disponible después de 3 intentos