Saltar al contenido
Editor

Bucles while en Python: cuando un bucle for no basta

Principiante20 min5 ejercicios65 XP

Esta lección es una traducción del original en inglés.Read in EnglishAvisar de un error de traducción

0/5 ejercicios

Una máquina expendedora no sabe cuántas monedas vas a meter. Se queda esperando: "mientras el total sea menor que el precio, sigue aceptando monedas". No puede usar un bucle for, porque no sabe de antemano cuántas iteraciones habrá. Necesita un bucle while.

En esta lección aprenderás a usar los bucles while en situaciones en las que necesitas repetir algo hasta que cambie una condición. También verás cómo evitar los bucles infinitos, cómo usar break para salir antes de tiempo y cuándo elegir while en lugar de for.

Al terminar, tendrás dos tipos de bucles en tu caja de herramientas: for, para recorrer colecciones conocidas, y while, para repetir hasta que se cumpla una condición.

¿Cómo funciona un bucle while en Python?

Un bucle while comprueba una condición antes de cada iteración. Si la condición es True, se ejecuta el cuerpo del bucle. Después, Python vuelve al principio y comprueba la condición otra vez. Esto se repite hasta que la condición pasa a ser False.

Piénsalo como un guardia en una puerta que revisa tu tarjeta de acceso cada vez que intentas entrar. Mientras tu tarjeta sea válida, puedes pasar. En cuanto deja de serlo, la puerta se queda cerrada.

Un bucle while sencillo que cuenta hasta 5
count = 1
while count <= 5:
print(count)
count += 1
print("Done!")
# Output:
# 1
# 2
# 3
# 4
# 5
# Done!
Salida
1
2
3
4
5
Done!

Así funciona: Python comprueba count <= 5. Como count empieza en 1, la condición es True, así que se ejecuta el cuerpo: imprime count y le suma 1. Luego Python vuelve a comprobar. Esto continúa hasta que count llega a 6; en ese momento, 6 <= 5 es False y el bucle se detiene.

La parte clave es que algo dentro del bucle tiene que acabar haciendo que la condición sea `False`. Aquí, count += 1 hace que el contador crezca hasta pasar de 5. Sin esa línea, el bucle no terminaría nunca.


¿Cómo se cuenta y se acumula con bucles while?

Los bucles while son ideales para tareas en las que tienes que procesar datos hasta alcanzar un objetivo concreto. Planteas una condición y el bucle se repite hasta llegar a la meta.

Contar: ¿cuántas veces hay que duplicar para pasar de 1000?
# How many doubles of 1 to exceed 1000?
value = 1
doubles = 0
while value <= 1000:
value = value * 2
doubles += 1
print(f"After {doubles} doubles, the value is {value}")
# Output:
# After 10 doubles, the value is 1024
Salida
After 10 doubles, the value is 1024

No sería fácil escribir esto con un bucle for, porque no sabemos de antemano cuántas veces habrá que duplicar. El bucle while sigue hasta que el valor pasa de 1000, y contamos cuántas veces se ejecutó.

Acumular: sumar hasta pasar de 100
# Summing numbers until the total reaches 100
total = 0
number = 1
while total < 100:
total += number
number += 1
# number was incremented one extra time after the last addition
print(f"Sum of 1 to {number - 1} = {total}")
# Output:
# Sum of 1 to 14 = 105
Salida
Sum of 1 to 14 = 105

El bucle suma números consecutivos (1, 2, 3, ...) hasta que el total llega a 100 o lo supera. Después del bucle, number vale uno más que el último número sumado, porque la línea number += 1 se ejecuta después de cada suma. Por eso imprimimos number - 1.


¿Qué son los bucles infinitos y cómo funciona break?

Un bucle infinito es un bucle cuya condición nunca llega a ser False. A veces es un error. Pero otras veces es intencionado: creas un bucle infinito a propósito y usas break para salir cuando te conviene.

Bucle infinito accidental (¡error!)
# DON'T RUN THIS - it never stops!
count = 1
while count <= 5:
    print(count)
    # Oops, forgot count += 1
Bucle infinito intencionado con break
while True:
    answer = "yes"
    print("Looping...")
    if answer == "yes":
        break
print("Escaped!")

while True crea un bucle que, en principio, se repite para siempre. La instrucción break sale del bucle de inmediato y salta a la primera línea que hay después de él. Este patrón es muy común en menús, bucles de juegos y validación de entradas.

Juego de adivinar un número con while True + break
# Simulating a guessing game (without real input)
secret = 7
guesses = [3, 9, 5, 7] # simulated guesses
attempt = 0
while True:
guess = guesses[attempt]
attempt += 1
print(f"Guess {attempt}: {guess}")
if guess == secret:
print(f"Correct! You got it in {attempt} tries!")
break
elif guess < secret:
print("Too low!")
else:
print("Too high!")
# Output:
# Guess 1: 3
# Too low!
# Guess 2: 9
# Too high!
# Guess 3: 5
# Too low!
# Guess 4: 7
# Correct! You got it in 4 tries!
Salida
Guess 1: 3
Too low!
Guess 2: 9
Too high!
Guess 3: 5
Too low!
Guess 4: 7
Correct! You got it in 4 tries!

El bucle sigue ejecutándose hasta que alguien adivina el número secreto. No podemos predecir cuándo va a pasar, así que while True con break es el patrón natural. El break solo se ejecuta cuando guess == secret, así que el bucle termina justo en el momento adecuado.


¿Cómo se valida una entrada con un bucle while?

Uno de los usos más prácticos de los bucles while es la validación de entradas: pedir datos una y otra vez hasta que el usuario te dé algo válido. Es el patrón que hay detrás de cada formulario que dice "escribe un correo electrónico válido".

Bucle de validación de entrada
# Simulating input validation (without real input)
test_inputs = ["abc", "-5", "0", "25"] # simulated user inputs
input_index = 0
age = -1 # start invalid
while age <= 0 or age > 120:
user_input = test_inputs[input_index]
input_index += 1
print(f"Enter your age: {user_input}")
if user_input.isdigit():
age = int(user_input)
else:
print("Please enter a number.")
continue
if age <= 0 or age > 120:
print("Age must be between 1 and 120.")
print(f"Your age: {age}")
# Output:
# Enter your age: abc
# Please enter a number.
# Enter your age: -5
# Age must be between 1 and 120.
# Enter your age: 0
# Age must be between 1 and 120.
# Enter your age: 25
# Your age: 25
Salida
Enter your age: abc
Please enter a number.
Enter your age: -5
Please enter a number.
Enter your age: 0
Age must be between 1 and 120.
Enter your age: 25
Your age: 25

El bucle sigue preguntando hasta que obtiene una edad válida. Las entradas no válidas, como "abc" o los números negativos, muestran mensajes de error, y el bucle se repite. Solo cuando llega una edad válida la condición age <= 0 or age > 120 pasa a ser False y el bucle termina.

Fíjate en la instrucción continue: cuando la entrada no es un número, nos saltamos el resto del cuerpo del bucle y volvemos directamente al principio. Aprenderás más sobre continue en la próxima lección.


¿Cuándo usar while y cuándo usar for?

Tanto for como while sirven para repetir código, pero están pensados para situaciones distintas. Elegir el adecuado hace que tu código sea más claro y menos propenso a errores.

Usa for cuando...Usa while cuando...
Recorres una colecciónEsperas a que cambie una condición
Sabes cuántas veces repetirNO sabes cuántas veces repetir
Procesas cada elemento de una listaRepites hasta que pase algo
Ejemplo: imprimir el nombre de cada estudianteEjemplo: seguir preguntando hasta recibir una entrada válida
Bucle for o bucle while: elige la herramienta adecuada
# FOR loop: you know the items to process
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(f"I like {fruit}")
print()
# WHILE loop: you don't know when to stop
num = 1
while num < 100:
num = num * 3
print(num, end=" ")
print(f"\nFirst power of 3 >= 100: {num}")
# Output:
# I like apple
# I like banana
# I like cherry
#
# 3 9 27 81 243
# First power of 3 >= 100: 243
Salida
I like apple
I like banana
I like cherry

3 9 27 81 243 
First power of 3 >= 100: 243

El bucle for es perfecto para la lista de frutas: sabemos exactamente qué vamos a recorrer. El bucle while es perfecto para las potencias de 3: no sabemos de antemano cuántas multiplicaciones harán falta para pasar de 100.

Bucle while (complejidad innecesaria)
names = ["Alice", "Bob", "Charlie"]
i = 0
while i < len(names):
    print(names[i])
    i += 1
Bucle for (limpio y sencillo)
names = ["Alice", "Bob", "Charlie"]
for name in names:
    print(name)

Ejercicios de práctica

¡Ahora te toca escribir bucles while! Estos ejercicios se centran en el tipo de problemas en los que los bucles while brillan: un número de iteraciones desconocido, parar según una condición y acumular.

Recuerda: un bucle while necesita algo que cambie dentro de él. Si tu bucle no termina nunca, comprueba que estás actualizando la variable de la condición.

Ejercicio 1: cuenta regresiva
Escribe el código

Usa un bucle while para imprimir una cuenta regresiva del 5 al 1, seguida de "Blastoff!" (¡despegue!) en la última línea.

Salida esperada:

5
4
3
2
1
Blastoff!
# Create a countdown from 5 to 1, then print "Blastoff!"
Ejercicio 2: encuentra la potencia de 2
Escribe el código

Empezando en 1, duplica un número una y otra vez hasta que supere 500. Imprime cada valor por el camino (incluido el primer valor que supera 500). Después, imprime el resultado final.

Salida esperada:

1
2
4
8
16
32
64
128
256
512
First power of 2 over 500: 512

Pista: usa un bucle while True con un break cuando el valor supere 500.

value = 1
# Keep doubling and printing until value exceeds 500
Ejercicio 3: predice la salida
Predice la salida

Sin ejecutar el código, predice exactamente lo que va a imprimir. Sigue con cuidado cada iteración y fíjate en cuándo se comprueba la condición y cuándo cambia x.

Después, ejecútalo para comprobar tu respuesta.

x = 10
while x > 1:
x = x // 2
print(x)
print("done")
Ejercicio 4: corrige el error del contador de dígitos
Corrige el error

Este código debería contar cuántos dígitos tiene un número dividiéndolo entre 10 una y otra vez. Pero tiene un error: da una respuesta incorrecta para el número 9999. Corrige el código para que imprima:

9999 has 4 digits

No cambies el número ni la instrucción print final.

number = 9999
original = number
digits = 0
while number >= 10:
number = number // 10
digits += 1
print(f"{original} has {digits} digits")
Ejercicio 5: la secuencia de Collatz
Escribe el código

La conjetura de Collatz es un problema matemático famoso. Empieza con cualquier entero positivo. Si es par, divídelo entre 2. Si es impar, multiplícalo por 3 y súmale 1. Repite hasta llegar a 1.

Empezando con n = 6, imprime cada valor de la secuencia (incluidos el 6 y el 1) y después imprime cuántos pasos hicieron falta.

Salida esperada:

6
3
10
5
16
8
4
2
1
Steps: 8
n = 6
steps = 0
# Print n, then apply Collatz rules until n reaches 1
# Count each transformation as a step

Resumen: bucles while en Python

Aquí tienes todo lo que aprendiste sobre los bucles while:

PatrónQué haceEjemplo
while condition:Repite hasta que la condición sea Falsewhile count > 0:
while True: + breakRepite sin fin; sales con breakBucles de juegos, menús
Bucle contadorCuenta hacia arriba o hacia abajo hasta un objetivowhile count <= 10:
Bucle acumuladorVa sumando un total o un resultadowhile total < 100:
Bucle de validaciónRepite hasta que la entrada sea válidawhile age <= 0:

Reglas clave para recordar:

  • La condición del while se comprueba ANTES de cada iteración
  • Algo dentro del bucle tiene que acabar haciendo que la condición sea False
  • break sale del bucle de inmediato
  • Usa for cuando sabes qué vas a recorrer
  • Usa while cuando necesitas repetir hasta que cambie una condición
  • Comprueba siempre que tu bucle while pueda terminar de verdad
  • ¿Qué sigue?

    Ya viste cómo break sirve para salir de un bucle antes de tiempo. Pero hay dos instrucciones más para controlar bucles: continue (salta el resto de esta iteración) y pass (no hace nada). En la siguiente lección, [break, continue y pass en Python](/python/python-break-continue-pass), dominarás las tres y aprenderás cuándo conviene usar cada una.

    Tutoriales relacionados

    ¿Te sirvió este tutorial?

    Sugerir una mejora