Pregunta 1¿Qué imprime el siguiente código?items = [10, 20, 30]
if (n := len(items)) >= 2:
print(n)
El operador morsa := para asignar y comprobar en una línea
Aprende el operador morsa := de Python 3.8 para asignar y comprobar un valor en una sola línea.
El operador morsa := se introdujo en Python 3.8 para dejarte asignar y comprobar en una línea. La forma := se parece a los colmillos de una morsa — de ahí el nombre. Reduce el código repetitivo cuando el mismo valor se reutiliza dentro de una condición if o while.
Lo básico del operador morsa
El = normal es una instrucción y no puede aparecer dentro de expresiones — por eso no puedes ponerlo en la condición de if o while. := es una expresión, así que puede ir directamente dentro de una condición.
Con variable := expresión, asignas el resultado a la variable y usas ese mismo valor como el valor de la condición.
La columna izquierda (normal) escribe la asignación y la comprobación en líneas separadas. La columna derecha (morsa) asigna y comprueba en una sola condición.
# Estilo normal (dos líneas)
cart = ["manzana", "pan", "leche", "huevos"]
n = len(cart)
if n >= 3:
print(f"{n} artículos: envío gratis")
# Versión con morsa (una línea: asignar + comprobar)
if (n := len(cart)) >= 3:
print(f"{n} artículos: envío gratis")
# Salida: 4 artículos: envío gratis
Envuélvelo entre paréntesis dentro de una condición
if n := len(cart) >= 3: sin paréntesis evalúa primero len(cart) >= 3 y asigna True/False a n. La forma idiomática es (n := len(cart)) >= 3 — envuelve la asignación entre paréntesis.
Usar el operador morsa con if
Un patrón común en if es necesitar también el valor comprobado dentro del cuerpo. Normalmente divides «asignar y luego comprobar» en dos líneas, pero el operador morsa te permite escribirlo una vez, justo donde se necesita el valor.
# Ramifica según el número de resultados de búsqueda y úsalo en el cuerpo
search_results = ["Libro A", "Libro B", "Libro C", "Libro D", "Libro E"]
if (hit_count := len(search_results)) >= 3:
print(f"{hit_count} resultados encontrados")
else:
print("Muy pocos resultados")
# Salida: 5 resultados encontrados
Usar el operador morsa con while
En while, la morsa brilla cuando quieres que el valor extraído sirva a la vez como condición y como algo que usas dentro del cuerpo.
Cada iteración primero comprueba si la cola está vacía. Si lo está, la evaluación de cortocircuito salta pop() y sale del bucle. En caso contrario queue.pop(0) toma la cabeza y la asigna a task, y el cuerpo se ejecuta con task antes de volver a iterar.
# Vaciar una cola elemento a elemento desde el frente
pending_jobs = ["enviar correo", "copia de seguridad", "desplegar"]
while pending_jobs and (job := pending_jobs.pop(0)):
print(f"procesando: {job}")
# procesando: enviar correo / procesando: copia de seguridad / procesando: desplegar
# En cuanto pending_jobs se vacía, el lado izquierdo se evalúa como False y se salta pop() — el bucle sale.
pending_jobs and (job := pending_jobs.pop(0)) sale del bucle mediante evaluación de cortocircuito en el instante en que el lado izquierdo está vacío (False). Eso evita el bug de llamar a pop() sobre una lista vacía y provocar IndexError.
Cuándo usarlo y cuándo no
El operador morsa no añade ninguna capacidad más allá de ahorrarte pulsaciones. Escribir lógica en una línea es cómodo, pero también puede dañar la legibilidad, así que sé selectivo al recurrir a él.
| Situación | Recomendación | Por qué |
|---|---|---|
| Reutilizar el valor comprobado dentro del cuerpo | Úsalo | Dividirlo en dos líneas aleja la variable de donde se usa |
| En while, usar el valor extraído a la vez como condición y dentro del cuerpo | Úsalo | Combina la condición de salida del bucle con la extracción |
| Cálculo complejo o efectos secundarios dentro de la condición | Evítalo | Esconder trabajo dentro de una expresión hace que el flujo sea difícil de seguir |
| Solo una asignación simple sin condición | No lo uses | Un `=` simple es más sencillo y fácil de leer |
En este artículo aprendiste cómo usar el operador morsa := para combinar asignación y comprobación en una sola expresión.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cuál es la forma correcta de usar el operador morsa dentro de una condición if?
Pregunta 3¿Qué afirmación describe mejor al operador morsa :=?