Aprende Python · lección gratuita
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.
*args recoge los argumentos posicionales sobrantes en una tupla.kwargs recoge los argumentos con nombre sobrantes en un diccionario**.args y kwargs son convención: lo que importa es el y el *.*lista desempaqueta sus elementos como argumentos posicionales.**diccionario desempaqueta sus pares clave-valor como argumentos con nombre.args, luego *kwargs.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.
# 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:*argses una tupla ykwargses un diccionario. Puedes recorrerlos confor, contar conlen()o acceder por índice/clave como cualquier tupla o diccionario.
| Sintaxis | Dónde | Qué hace |
|---|---|---|
def f(*args) | definición | Recoge posicionales en una tupla |
def f(**kwargs) | definición | Recoge nombrados en un diccionario |
def f(a, args, *kwargs) | definición | Orden correcto de parámetros |
f(*lista) | llamada | Desempaqueta la lista como posicionales |
f(**dicc) | llamada | Desempaqueta el dict como clave=valor |
len(args) | dentro | Cuenta los argumentos recibidos |
for k, v in kwargs.items() | dentro | Recorre los pares nombre-valor |
---