Repetir mientras se cumpla una condición
Un bucle while comprueba una condición antes de cada vuelta y ejecuta su bloque mientras la condición sea True. Úsalo cuando no sepas de antemano cuántas vueltas necesitas: reducir una orden a la mitad hasta que sea lo bastante pequeña, esperar a que un precio cruce un nivel, hacer crecer un saldo hasta un objetivo. Algo dentro del bloque tiene que cambiar la condición, o el bucle nunca termina.
# Halve an order until it is small enough to trade at once
quantity, limit = 1000, 100
steps = 0
while quantity > limit:
quantity = quantity / 2
steps += 1
print(steps, quantity) # 4 62.5¿for o while?
Usa for cuando ya tengas los elementos o conozcas la cantidad: no puede ejecutarse para siempre. Usa while cuando el punto de parada dependa de lo que ocurra durante el bucle. Una buena prueba: si puedes decir «por cada uno de estos», escribe for; si dices «hasta que esto sea verdadero», escribe while.
while, comprueba tres cosas: la condición usa una variable que el bucle cambia, el cambio ocurre en cada vuelta y acerca la condición a False. Si un bucle tarda demasiado aquí, se detiene a los 10 segundos.break: salir del bucle ahora
break termina el bucle en el acto y continúa con la línea siguiente. Es la forma de parar en cuanto tienes la respuesta, como el primer precio que supera un límite. Aquí el bucle recorre posiciones con un índice que incrementa él mismo.
# break leaves the loop at once
prices = [184.25, 184.5, 186.0, 185.0]
limit = 185.5
index = 0
while index < len(prices):
if prices[index] > limit:
print("breach at", index) # breach at 2
break
index += 1continue: saltar a la siguiente vuelta
continue salta el resto de la vuelta actual y vuelve a la condición. Es útil para ignorar datos malos sin anidar el trabajo real dentro de un if. En un bucle while, cambia la variable del bucle antes de continue; si no, el bucle se topa con el mismo elemento para siempre.
# continue skips the rest of the pass; step first, or it never moves on
fills = [100, -5, 250, 0, 75]
total = 0
index = 0
while index < len(fills):
value = fills[index]
index += 1
if value <= 0:
continue
total += value
print(total) # 425Bucles que buscan o convergen
Muchas tareas de quant son del tipo «sigue hasta que»: capitalizar hasta un objetivo, afinar una estimación hasta que deje de cambiar, reintentar hasta que una petición tenga éxito. while True: con un break en medio es una forma habitual cuando la prueba de salida va en mitad del trabajo.
# How many years until 10,000 grows to 15,000 at 7% a year?
balance, target, rate = 10_000, 15_000, 0.07
years = 0
while balance < target:
balance = balance * (1 + rate)
years += 1
print(years) # 6
# while True + break: the exit test sits in the middle
attempt = 0
while True:
attempt += 1
if attempt * 25 >= 100:
break
print(attempt) # 4- La condición usa una variable que el bucle cambia.
- El cambio ocurre en cada vuelta, incluso antes de un
continue. - Usa
breaken cuanto se conozca la respuesta.
A continuación: definir y llamar funciones, para ponerle nombre a un bloque de código y reutilizarlo.
Lab: qué se califica
- Contar las mitades que necesita una orden con
halving_steps25 pts - Hallar el primer precio por encima de un límite con
first_breach25 pts - Sumar las ejecuciones válidas hasta la marca final con
sum_until_zero25 pts - Capitalizar un saldo hasta un objetivo con
years_to_target25 pts