El bucle for de Python es "para cada"
Si has usado un lenguaje con estilo C, el bucle for de Python te parecerá distinto. No hay patrón for (i = 0; i < n; i++) con contador. El for de Python es estrictamente un bucle para cada: le das una colección y te devuelve los elementos uno a uno.
Eso imprime tres líneas. Python lee la lista, saca cada elemento por turno y lo ata a color mientras el cuerpo se ejecuta. Cuando no queda nada, el bucle termina.
Fíjate en la forma — for <nombre> in <iterable>: seguido de un cuerpo indentado. Indentación, dos puntos, cuerpo; la misma estructura que if.
Qué cuenta como iterable
Prácticamente cualquier cosa que contenga una secuencia de valores. Listas, tuplas, strings, ranges, dicts, sets, archivos y la mayoría de objetos custom que construirás.
La uniformidad es lo bonito — una sintaxis, muchas formas de datos.
Contar con range()
Cuando sí quieres un contador — "haz esto diez veces" o "recorre los índices 0 a 9" — usa range():
Eso imprime 0, 1, 2, 3, 4. range(stop) cuenta desde 0 hasta pero sin incluir stop. range(start, stop) te deja fijar un valor inicial, y range(start, stop, step) te deja controlar el tamaño del paso:
Hay una página dedicada a range viniendo porque vale la pena entenderlo un poco más a fondo. Por ahora, range(n) te da n iteraciones numeradas de 0 a n-1.
enumerate en Python: iterar con un índice
Una necesidad común: "quiero el índice y el valor juntos". El instinto del principiante es usar range(len(...)), pero Python tiene una herramienta más agradable:
enumerate() produce pares (index, value). La doble variable después de for desempaqueta el par en dos nombres — index y color. Mucho más limpio que:
Si quieres empezar a contar en 1 en vez de 0, pasa start=1:
zip en Python: iterar sobre dos secuencias juntas
Cuando tienes dos listas del mismo tamaño y quieres emparejarlas:
zip se detiene en la secuencia más corta. Si quieres que siga y rellene con None, usa itertools.zip_longest.
Iterar un dict
Los diccionarios te dan opciones sobre qué recorrer:
La mayor parte del tiempo quieres .items() — obtienes la clave y el valor juntos en una línea legible.
break y continue
A veces quieres salirte antes o saltarte una iteración.
break sale del bucle inmediatamente:
En cuanto se encuentra un número mayor que 6, el bucle se detiene. Los elementos restantes se ignoran.
continue salta el resto de la iteración actual y pasa a la siguiente:
Ambos son correctos, aunque continue puede hacer los bucles más difíciles de seguir si tienes más de uno. A menudo un simple if/else se lee mejor.
La cláusula else en un bucle
Python tiene una feature que la mayoría de lenguajes no tienen: una cláusula else en los bucles. Se ejecuta cuando el bucle termina sin haber golpeado un break.
Útil, pero inicialmente confusa. No te sientas obligado a usarla — una bandera booleana fuera del bucle suele ser más clara para lectores nuevos.
Mutar una lista mientras iteras
Una trampa que vale la pena señalar: no añadas ni quites elementos de una lista mientras estás iterándola. La iteración se confunde sobre qué índices siguen siendo válidos, y te pierdes elementos o disparas un error. El patrón seguro es construir una lista nueva:
O, cuando estés cómodo, una list comprehension hace lo mismo en una línea — lo cubriremos en el capítulo de colecciones.
Un pequeño ejemplo de principio a fin
Juntamos unos cuantos de estos — leer una lista, filtrar, enumerar, imprimir:
Siguiente: bucles while
for es la elección correcta cuando sabes sobre qué estás iterando. while es la elección correcta cuando estás en bucle hasta que cambie una condición — eso viene ahora.
Preguntas frecuentes
¿Cómo funciona un bucle for en Python?
for item in sequence: ejecuta el cuerpo indentado una vez por cada elemento en la secuencia, asumiendo item cada valor por turno. Las secuencias incluyen listas, tuplas, strings, dicts, ranges y cualquier objeto que defina un iterador.
¿Cuál es la diferencia entre break y continue?
break sale del bucle inmediatamente, saltándose cualquier iteración restante. continue salta el resto de la iteración actual y pasa a la siguiente. break es para "he terminado"; continue es para "saltarse esta".
¿Cómo itero con un índice en Python?
Envuelve la secuencia en enumerate(...) para obtener pares (index, value): for i, item in enumerate(items):. Mucho más limpio que mantener tu propio contador con i += 1 al final del bucle.