Bucles en Python
Ya sabes hacer que tu programa tome decisiones con if. El siguiente problema es distinto: ¿qué haces cuando necesitas repetir una instrucción diez veces, cien veces, o hasta que se cumpla cierta condición, sin copiar y pegar la misma línea una y otra vez? Para eso existen los bucles: while y for.
Bienvenido
Ya sabes crear variables, leer datos del usuario y hacer que tu programa tome decisiones con if/elif/else. Lo que falta es repetir: pedir datos varias veces, recorrer los caracteres de un texto, imprimir una tabla completa. Eso es exactamente lo que hacen los bucles.
Al finalizar esta guía sabrás repetir instrucciones con while mientras se cumpla una condición, recorrer secuencias con for y range(), controlar un bucle con break y continue, anidar bucles, y evitar los errores más comunes (como el temido bucle infinito).
Todos los bloques con el encabezado Python son editables: presiona ✏️ Editar para modificar el código y ▶ Ejecutar para correrlo de verdad en tu navegador (usa Pyodide, un Python real compilado a WebAssembly). La primera ejecución tarda unos segundos porque descarga el intérprete.
Un bucle que nunca cumple su condición de salida se ejecuta para siempre y puede colgar la pestaña del navegador. Antes de ejecutar tu código, revisa siempre que exista una forma de que el bucle termine.
📖 Aprende
La diferencia entre repetir "mientras se cumpla algo" (while) y repetir "un número conocido de veces" (for).
💻 Practica
Ejemplos editables y ejecutables en cada sección.
🎯 Domina
range(), break, continue, bucles anidados y los errores que evitan la mayoría de los principiantes.
El bucle while
Un bucle while repite su bloque de instrucciones mientras una condición sea verdadera. Se escribe igual que un if —dos puntos e indentación— pero en vez de ejecutarse una sola vez, vuelve a evaluar la condición al terminar el bloque, y repite si sigue siendo True.
contador = 1
while contador <= 5:
print(contador)
contador = contador + 1
print("Fin del bucle")
Salida:
1 2 3 4 5 Fin del bucle
Si olvidas la línea contador = contador + 1, la condición contador <= 5 nunca se vuelve falsa y el bucle se repite para siempre. Todo while necesita algo dentro del bloque que eventualmente haga falsa la condición: eso se llama la actualización del bucle.
while también sirve para acumular un resultado sin saber de antemano cuántas veces se va a repetir, por ejemplo pidiendo números hasta que el usuario decida parar:
suma = 0
numero = int(input("Número (0 para terminar): "))
while numero != 0:
suma = suma + numero
numero = int(input("Número (0 para terminar): "))
print("La suma total es:", suma)
Usa while cuando no sabes de antemano cuántas repeticiones va a haber (depende de una condición, como la respuesta del usuario). Más adelante en esta guía vas a ver for, la opción natural cuando sí sabes cuántas veces —o sobre qué secuencia— quieres repetir.
break y continue
Dentro de cualquier bucle, break y continue te dan control fino sobre la repetición: break corta el bucle por completo, y continue salta directamente a la siguiente repetición sin ejecutar el resto del bloque en esa vuelta.
| Instrucción | Qué hace |
|---|---|
break | Termina el bucle inmediatamente, sin volver a evaluar la condición. |
continue | Salta el resto del bloque en esta vuelta y pasa directo a la siguiente repetición. |
while True:
respuesta = input("Escribe 'salir' para terminar: ")
if respuesta == "salir":
break
print("Escribiste:", respuesta)
print("Programa terminado")
Python no tiene una estructura do-while como otros lenguajes (repetir al menos una vez, y recién después revisar la condición). El patrón while True: combinado con un break condicional adentro cumple exactamente esa función, y es muy común para pedir datos "hasta que el usuario haga algo válido".
continue es distinto: no termina el bucle, solo se salta la vuelta actual.
numero = 0
while numero < 10:
numero = numero + 1
if numero % 2 == 0:
continue
print(numero)
Salida (solo los números impares, porque los pares activan continue antes de llegar al print):
1 3 5 7 9
El bucle for con range()
Cuando sabes exactamente cuántas veces quieres repetir algo, for es más directo que while: no necesitas crear un contador ni actualizarlo a mano. La forma más común es combinarlo con range(), que genera una secuencia de números.
for i in range(5):
print(i)
Salida:
0 1 2 3 4
range(n) genera los números desde 0 hasta n - 1: en total, exactamente n números. Esperar que range(5) incluya el 5 es el error de "conteo por uno" (off-by-one) más común al empezar con for.
range() también acepta un inicio y un paso, no solo el final:
| Forma | Genera |
|---|---|
range(5) | 0, 1, 2, 3, 4 |
range(2, 6) | 2, 3, 4, 5 |
range(0, 10, 2) | 0, 2, 4, 6, 8 |
range(10, 0, -1) | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 |
tabla = 7
for i in range(1, 11):
print(tabla, "x", i, "=", tabla * i)
for sobre cadenas y listas
for no solo recorre números generados por range(): puede recorrer directamente cualquier secuencia, como los caracteres de un str o los elementos de una list, que ya conoces de la guía de Tipos de Datos. En ese caso no necesitas índices: Python te entrega cada elemento directamente.
for letra in "Python":
print(letra)
materias = ["POO", "Base de Datos II", "Ingeniería de Software", "TGS"]
for materia in materias:
print("Estás inscrito en:", materia)
Vas a ver mucho código (sobre todo de gente que viene de otros lenguajes) que recorre una lista así: for i in range(len(materias)): print(materias[i]). Funciona, pero en Python es más idiomático iterar directamente sobre los elementos, como en el ejemplo de arriba: es más corto y más difícil de romper con un índice mal calculado.
Bucles anidados
Un bucle puede contener otro bucle completo dentro de su bloque. Por cada vuelta del bucle externo, el bucle interno se ejecuta por completo desde el principio. Es la herramienta natural para recorrer una cuadrícula, como filas y columnas.
for fila in range(1, 4):
for columna in range(1, 4):
print(fila, "x", columna, "=", fila * columna)
print("--- fin de la fila", fila, "---")
Si el bucle externo se repite 3 veces y el interno también 3 veces, el bloque más interno se ejecuta 3 × 3 = 9 veces en total. Con bucles anidados grandes (por ejemplo, dos range(1000)), el número de repeticiones crece muy rápido — vale la pena tenerlo en cuenta antes de ejecutar.
Errores comunes
❌ Bucle infinito
Olvidar actualizar la variable que controla la condición de un while hace que nunca se vuelva falsa. El programa se cuelga y hay que forzar su cierre.
❌ Conteo por uno (off-by-one) con range()
Esperar que range(n) incluya el número n, cuando en realidad se detiene en n - 1.
❌ break o continue fuera de un bucle
Usar break o continue fuera de un while o un for produce SyntaxError: ambos solo tienen sentido dentro de un bucle.
❌ Usar while cuando conviene for
Armar un contador manual con while para repetir un número fijo de veces funciona, pero es más código y más fácil de romper que usar for con range() directamente.
Descubre la sorpresa
Ejecuta este bloque tal como está: probablemente esperabas ver el número 5 al final, pero no aparece.
for i in range(1, 5):
print(i)
range(1, 5) genera 1, 2, 3, 4: se detiene justo antes del segundo número. Edita el bloque y cambia range(1, 5) por range(1, 6) para que el 5 sí aparezca.
Ejercicios Propuestos
Pon en práctica lo aprendido resolviendo los siguientes ejercicios directamente en el bloque editable.
- Usa
whilepara imprimir los números del 1 al 10. - Usa
while Truejunto conbreakpara pedir números coninput()hasta que el usuario escriba"salir". - Usa
forconrange()para imprimir la tabla del 7, del 7x1 al 7x10. - Usa
continuedentro de unforconrange(1, 21)para imprimir solo los números impares. - Usa un
forpara recorrer la cadena"Python"letra por letra e imprimir cada una. - Escribe dos bucles anidados que impriman un cuadrado de asteriscos de 4 filas por 4 columnas.
Reto Final
Escribe el clásico FizzBuzz: recorre con un for y range() los números del 1 al 30, y para cada uno:
- Si es divisible entre
3y entre5a la vez, imprime"FizzBuzz". - Si es divisible solo entre
3, imprime"Fizz". - Si es divisible solo entre
5, imprime"Buzz". - Si no es divisible entre ninguno de los dos, imprime el número.
Combina lo que ya sabías de la guía de Condicionales (if/elif/else, operador %) con lo nuevo de esta guía (for y range()).
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
Cheat Sheet
| Uso | Ejemplo |
|---|---|
| Repetir mientras se cumpla algo | while condición: ... |
| Repetir "hasta que" (sin do-while) | while True: ... if cond: break |
| Repetir n veces | for i in range(n): ... |
| Repetir en un rango | for i in range(a, b): ... |
| Repetir con paso | for i in range(a, b, paso): ... |
| Recorrer una cadena | for letra in texto: ... |
| Recorrer una lista | for elemento in lista: ... |
| Cortar el bucle | break |
| Saltar a la siguiente vuelta | continue |
¿Sabías que...?
🐍 Sin do-while
Python nunca incluyó una estructura do-while nativa como C o Java: el patrón while True: con un break condicional cumple esa misma función.
🔁 for...else
Python permite un bloque else al final de un for o un while, que se ejecuta solo si el bucle terminó completo, sin pasar por ningún break. Es poco común, pero existe.
📇 Más herramientas de iteración
Más adelante en el curso vas a conocer enumerate() (para recorrer una lista con su índice a la vez) y otras herramientas que hacen que recorrer secuencias en Python sea todavía más cómodo.