Tiza Las materias del CBC
Practicar →

Pensamiento Computacional (090) · Unidad 3 — Estructuras de control

Ciclo for y range

for repite una vez por cada elemento de algo. range fabrica esos elementos, y arranca en 0 y termina antes del número que le des.

Practicar este tema →7 ejercicios que te corrigen paso a paso · gratis, sin cuenta

La explicación

Recorrer algo

for letra in "sol":
    print(letra)

Imprime s, o, l. La variable letra toma cada valor, uno por vuelta. Su nombre lo elegís vos.

range fabrica números

range(5)         → 0, 1, 2, 3, 4
range(2, 7)     → 2, 3, 4, 5, 6
range(0, 10, 3)  → 0, 3, 6, 9
range(5, 0, -1)  → 5, 4, 3, 2, 1
Arranca en el primero, termina ANTES del segundo. range(5) no incluye el 5; da cinco números, del 0 al 4. Por eso range(n) sirve tan bien para recorrer algo de n elementos: los índices van justo de 0 a n−1.

Y de ahí sale el nombre del error más famoso de programación: el off-by-one, equivocarse por uno. Si tu ciclo procesa un elemento de más o de menos, empezá mirando el range.

Dos formas de recorrer

for c in palabra:            # los caracteres
    print(c)

for i in range(len(palabra)):  # las posiciones
    print(i, palabra[i])

La primera es más limpia y es la que conviene casi siempre. La segunda sólo cuando necesitás saber en qué posición estás.

Acumular

El patrón más usado de todos: una variable afuera que se va sumando adentro.

total = 0                # afuera, antes de empezar
for n in range(1, 6):
    total = total + n   # adentro, una vez por vuelta
print(total)            # 15
El acumulador va afuera del ciclo. Si lo ponés adentro se reinicia en cada vuelta y al final te queda sólo el último valor. Es un error que no tira ningún mensaje: simplemente el resultado está mal, y cuesta verlo.

Un range que no da vueltas

range(3, 3) está vacío: el ciclo no se ejecuta ni una vez. No es un error, y explica esos casos raros donde "el for no hace nada".

Ejemplo resuelto

Escribir una función que reciba un número n y devuelva la suma de todos los pares desde 1 hasta n.

Las tres decisiones. Qué recorro, qué acumulo, y cuándo sumo.

def suma_pares(n):
    total = 0                    # acumulador, afuera
    for i in range(1, n + 1):  # el n+1 es para que n entre
        if i % 2 == 0:           # sólo los pares
            total = total + i
    return total

Por qué n + 1. Como range termina antes del segundo número, range(1, n) dejaría afuera justo a n. Con n + 1 el último valor que entra es n. Es el off-by-one en su forma más común.

Probemos con n = 10: suma 2 + 4 + 6 + 8 + 10 = 30.

Hay una versión más directa usando el paso de range, que arranca en 2 y va de a 2:
def suma_pares(n):
    total = 0
    for i in range(2, n + 1, 2):
        total = total + i
    return total
Hace la mitad de vueltas y no necesita el if. Cuando puedas expresar la condición en el propio range, sale mejor.

Control: con n = 2 tiene que dar 2, y con n = 1 tiene que dar 0. Los casos chicos son los que descubren los off-by-one.

Dónde se cae la mayoría

Hasta acá la explicación. La práctica es la otra mitad: 7 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Además trae una animación que muestra la idea en movimiento.

Practicar Ciclo for y range →

Ver todos los temas de Pensamiento Computacional