Aprende Python · lección gratuita

Lección 20 · args, kwargs y desempaquetado

Resumen

Hasta ahora tus funciones recibían un número fijo de parámetros. Pero a veces no sabes cuántos argumentos te van a pasar: una función que suma "todos los números que le des" o que imprime "todas las opciones que quieras". Para eso Python ofrece args y *kwargs, que recogen un número variable de argumentos. Además, el operador y también sirven para hacer lo contrario: desempaquetar* una lista o un diccionario y repartir sus valores como argumentos al llamar a una función.

Conceptos

Cuando defines una función con args, Python agrupa todos los argumentos posicionales que sobren en una tupla llamada args. Esto te permite escribir funciones flexibles que aceptan cualquier cantidad de valores. De forma análoga, kwargs agrupa los argumentos pasados con nombre=valor en un diccionario*. Puedes recorrer ambos con un bucle for, igual que cualquier tupla o diccionario.

def sumar(*numeros):
    total = 0
    for n in numeros:       # numeros es una tupla
        total += n
    return total

print(sumar(1, 2, 3))       # 6
print(sumar(10, 20))        # 30
print(sumar())              # 0

El operador también funciona "al revés". Si tienes una lista y una función que espera argumentos separados, puedes desempaquetarla con en la llamada. Lo mismo con ** para diccionarios: cada par clave=valor se convierte en un argumento con nombre. Esto evita tener que escribir func(datos[0], datos[1], datos[2]) a mano.

def punto(x, y, z):
    return f"({x}, {y}, {z})"

coords = [3, 4, 5]
print(punto(*coords))                 # (3, 4, 5)

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

El orden en la definición de una función siempre es: primero los parámetros normales (posicionales o con valor por defecto), luego args, y al final *kwargs. Así Python sabe a dónde va cada argumento que recibe.

Ejemplos

# 1) *args recoge posicionales en una tupla
def listar(*items):
    print(items)            # es una tupla
listar("a", "b", "c")       # ('a', 'b', 'c')

# 2) **kwargs recoge nombrados en un diccionario
def perfil(**datos):
    for clave, valor in datos.items():
        print(f"{clave}: {valor}")
perfil(nombre="Ana", edad=30)
# nombre: Ana
# edad: 30

# 3) Combinar parámetro normal + *args
def saludar(saludo, *nombres):
    for n in nombres:
        print(f"{saludo}, {n}")
saludar("Hola", "Luis", "Marta")
# Hola, Luis
# Hola, Marta

# 4) Desempaquetar lista y diccionario al llamar
def rect(ancho, alto):
    return ancho * alto
medidas = [4, 5]
print(rect(*medidas))                 # 20
conf = {"ancho": 6, "alto": 2}
print(rect(**conf))                   # 12
💡 **Recuerda: *args es una tupla y kwargs es un diccionario. Puedes recorrerlos con for, contar con len() o acceder por índice/clave como cualquier tupla o diccionario.

Cheatsheet

SintaxisDóndeQué hace
def f(*args)definiciónRecoge posicionales en una tupla
def f(**kwargs)definiciónRecoge nombrados en un diccionario
def f(a, args, *kwargs)definiciónOrden correcto de parámetros
f(*lista)llamadaDesempaqueta la lista como posicionales
f(**dicc)llamadaDesempaqueta el dict como clave=valor
len(args)dentroCuenta los argumentos recibidos
for k, v in kwargs.items()dentroRecorre los pares nombre-valor

---

← Argumentos de funcionesScope, lambda, map y filter →

Ver todas las lecciones de Aprende Python →