Decisiones y repetición
Convierte requisitos en condiciones y bucles cuyas reglas de parada puedas explicar.
AL TERMINAR, PODRÁS
- Traducir requisitos a condiciones booleanas
- Seguir un bucle paso a paso sin adivinar
- Definir una condición de parada y un invariante
Descripción del diagrama: Inicio → ¿Quedan trabajos?; ¿Quedan trabajos? → Toma uno y procésalo (sí); Toma uno y procésalo → ¿Quedan trabajos? (uno menos); ¿Quedan trabajos? → Terminar (no); done + pending == total: se cumple en cada vuelta
Haz explícita la decisión
Un requisito como «reintentar los trabajos fallidos menos de tres veces» esconde dos condiciones: el trabajo debe haber fallado y su contador de intentos debe estar por debajo del límite.
Escribe ambas. Python usa la indentación (el sangrado al inicio de la línea) para agrupar instrucciones, así que el formato cambia el significado. Prueba valores en el límite como cero, dos y tres intentos.
Un límite que está mal por exactamente uno, como usar <= donde iba <, se llama error de uno más o uno menos (off-by-one). Fíjate en si el contador representa intentos ya hechos o intentos restantes; cualquiera de las dos convenciones sirve, pero mezclarlas produce errores que al usuario le parecen aleatorios.
status = "failed"
attempts = 2
should_retry = status == "failed" and attempts < 3
if should_retry:
print("Schedule another attempt")
Repite con un propósito
Un bucle for recorre los elementos de un iterable (cualquier cosa que se pueda recorrer, como una lista de trabajos).
Un bucle while se repite mientras una condición siga siendo verdadera. Elige la forma que haga más evidente la regla de parada. Si un while quita un trabajo pendiente en cada vuelta, la cantidad de pendientes baja hacia cero.
Si agrega más trabajo del que quita, para asegurar que termina necesitas otro argumento. Los workers (procesos trabajadores) en producción suelen ejecutarse indefinidamente, pero aun así necesitan reglas explícitas de cancelación y apagado.
Mantén un hecho siempre verdadero
Un invariante es una afirmación que sigue siendo verdadera en un punto elegido del algoritmo.
Para un worker simple que procesa un lote, podría ser «procesados más restantes es igual al tamaño original del lote». Comprueba que se cumple antes del bucle y después de cada iteración. Así puedes razonar sobre programas de más de unas pocas líneas.
No borres elementos de una lista mientras la recorres, a menos que manejes a propósito el cambio de índices. Construir una lista de resultados nueva suele ser más claro.
jobs = ["email", "report", "thumbnail"]
processed = []
for job in jobs:
processed.append(job.upper())
print(processed)
ERROR FRECUENTE
Usar <= cuando el requisito dice estrictamente por debajo de un límite, o modificar la colección que estás recorriendo.
INTÉNTALO TÚ
Dados los contadores de intentos [0, 1, 3, 2, 4], construye una lista que contenga solo los que pueden intentarse otra vez con un límite de tres. Explica por qué se excluye el tres.
Decide en el laboratorio.
El checkpoint de dos preguntas, tus notas y tu progreso guardado están en el laboratorio. Gratis y sin cuenta.
Abrir en el laboratorio ↗CONÉCTALO CON RELAY
Procesa un lote fijo de trabajos de Relay y separa los completados de los que se pueden reintentar. Enuncia un invariante para tu bucle.