Repetir un bloque por cada elemento
Un bucle for ejecuta su bloque con sangría una vez por cada elemento de una colección y le da un nombre al elemento en esa vuelta. Aquí la colección es una lista, escrita con corchetes y comas (las listas tendrán su propio tema más adelante). La sintaxis se parece a la de if: dos puntos al final de la primera línea y un bloque con sangría debajo.
prices = [184.25, 184.5, 184.0]
for price in prices:
print(price) # 184.25, then 184.5, then 184.0range: contar sin una lista
range(n) produce los enteros de 0 a n - 1: el valor final no se incluye, por eso range(5) tiene cinco números. range(start, stop) empieza donde tú digas, y range(start, stop, step) avanza de step en step, que puede ser negativo para contar hacia atrás. Úsalo cuando necesites repetir algo un número de veces o recorrer posiciones.
# range counts, and stops before the stop value
print(list(range(5))) # [0, 1, 2, 3, 4]
print(list(range(2, 10, 3))) # [2, 5, 8]
print(list(range(3, 0, -1))) # [3, 2, 1]El patrón del acumulador
La mayoría de los bucles siguen un patrón: iniciar una variable antes del bucle, actualizarla dentro y usarla después. total += price * quantity es una abreviatura de total = total + price * quantity. Aquí cada elemento de la lista es un par, y la línea del bucle nombra ambas mitades a la vez (los siguientes temas explican este desempaquetado como es debido).
# Accumulate a total over the trades
trades = [(184.25, 200), (185.0, 100), (183.5, 50)]
total = 0.0
for price, quantity in trades:
total += price * quantity
print(total) # 64525.0Recorrer posiciones
A veces hay que comparar cada elemento con el anterior. Recorre las posiciones con range(1, len(prices)): empieza en 1, así que prices[i - 1] siempre es válido. len() da el número de elementos y prices[i] toma el elemento en la posición i, contando desde 0.
# Compare each price with the one before it
prices = [184.0, 184.5, 184.25, 185.0]
ups = 0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]:
ups += 1
print(ups) # 2Construir una lista sobre la marcha
Para recoger un resultado por vuelta, empieza con una lista vacía [] y llama a .append(value) dentro del bucle. Las escaleras de precios, los totales acumulados y las señales por día se construyen así. La lista se devuelve (o se usa) cuando termina el bucle.
# Build a list of prices, one per tick level
start, tick = 184.0, 0.25
ladder = []
for level in range(4):
ladder.append(start + level * tick)
print(ladder) # [184.0, 184.25, 184.5, 184.75]A continuación: los bucles while, break y continue, para repetir hasta que cambie una condición en lugar de un número fijo de elementos.
Lab: qué se califica
- Sumar el valor de muchas operaciones con
total_notional25 pts - Trazar niveles de precio con
price_ladder25 pts - Contar los días en que subió el precio con
count_up_days25 pts - Llevar un total acumulado con
running_total25 pts