Bucle while
El Bucle while en Python
Qué es un bucle while
Un bucle while repite un bloque de código mientras una condición sea verdadera. En cuanto la condición se vuelve False, el bucle se detiene y el programa continúa con lo que hay después.
La diferencia fundamental con el bucle for es que el while no sabe de antemano cuántas veces va a repetirse. Se repite indefinidamente hasta que algo hace que su condición falle. Esto lo hace ideal para situaciones donde no sabes cuántas iteraciones necesitarás.
Estructura básica
while condicion:
# código que se repite mientras condicion sea True
# en algún momento algo debe hacer que condicion sea False
# o el bucle nunca terminará
El flujo es siempre el mismo: Python evalúa la condición, si es True ejecuta el bloque, vuelve a evaluar la condición, si sigue siendo True ejecuta el bloque otra vez, y así sucesivamente hasta que la condición sea False.
contador = 0
while contador < 5:
print(f"Iteración número {contador}")
contador += 1
print("El bucle ha terminado")
```
Salida:
```
Iteración número 0
Iteración número 1
Iteración número 2
Iteración número 3
Iteración número 4
El bucle ha terminado
Lo que ocurre paso a paso: contador empieza en 0, la condición 0 < 5 es True, se ejecuta el bloque y contador pasa a 1. La condición 1 < 5 es True, se ejecuta y contador pasa a 2. Esto se repite hasta que contador vale 5, momento en que 5 < 5 es False y el bucle termina.
El peligro del bucle infinito
Si la condición nunca se vuelve False, el bucle no termina nunca. Esto se llama bucle infinito y bloquea el programa.
# ESTO ES UN BUCLE INFINITO — no lo ejecutes
contador = 0
while contador < 5:
print("Esto no termina nunca")
# contador nunca cambia, siempre es 0, siempre es < 5
Para detener un bucle infinito en ejecución pulsa Ctrl + C en la terminal.
Un bucle infinito ocurre cuando:
- Olvidas modificar la variable de la condición dentro del bucle
- La modificas pero en la dirección equivocada
- La condición nunca puede volverse False por la lógica del programa
# Error típico — olvidar el incremento
x = 1
while x <= 10:
print(x)
# falta x += 1
# Error típico — decrementar cuando debería incrementar
x = 1
while x <= 10:
print(x)
x -= 1 # x se hace cada vez más pequeña, nunca llega a 10
1. Uso como contador
La forma más básica: repetir algo un número determinado de veces usando una variable contadora.
Contador ascendente
numero = 1
while numero <= 10:
print(f"{numero} x 7 = {numero * 7}")
numero += 1
```
Salida:
```
1 x 7 = 7
2 x 7 = 14
3 x 7 = 21
...
10 x 7 = 70
Contador descendente
cuenta_atras = 10
print("Iniciando cuenta atrás...")
while cuenta_atras > 0:
print(f"{cuenta_atras}...")
cuenta_atras -= 1
print("¡Despegue!")
Contador con paso personalizado
# Contar de 2 en 2
numero = 0
while numero <= 20:
print(numero, end=" ")
numero += 2
# 0 2 4 6 8 10 12 14 16 18 20
# Contar de 3 en 3 hacia atrás
numero = 30
while numero >= 0:
print(numero, end=" ")
numero -= 3
# 30 27 24 21 18 15 12 9 6 3 0
2. Validación de entrada de datos
Este es uno de los usos más importantes y frecuentes del while. Repite la petición de datos al usuario hasta que introduce algo válido.
Validar un rango numérico
while True:
nota = float(input("Introduce una nota (0-10): "))
if 0 <= nota <= 10:
break
print(f"Error: {nota} no es válido. La nota debe estar entre 0 y 10.")
print(f"Nota registrada: {nota}")
```
Ejecución:
```
Introduce una nota (0-10): 15
Error: 15.0 no es válido. La nota debe estar entre 0 y 10.
Introduce una nota (0-10): -3
Error: -3.0 no es válido. La nota debe estar entre 0 y 10.
Introduce una nota (0-10): 7.5
Nota registrada: 7.5
Validar que sea un número (controlar excepciones)
while True:
entrada = input("Introduce tu edad: ")
try:
edad = int(entrada)
if edad > 0:
break
print("La edad debe ser un número positivo.")
except ValueError:
print(f"'{entrada}' no es un número válido. Inténtalo de nuevo.")
print(f"Edad registrada: {edad}")
```
Ejecución:
```
Introduce tu edad: hola
'hola' no es un número válido. Inténtalo de nuevo.
Introduce tu edad: -5
La edad debe ser un número positivo.
Introduce tu edad: 22
Edad registrada: 22
Validar una opción de menú
print("Selecciona una opción:")
print("1. Ver perfil")
print("2. Editar datos")
print("3. Salir")
opcion = ""
while opcion not in ["1", "2", "3"]:
opcion = input("Opción (1/2/3): ")
if opcion not in ["1", "2", "3"]:
print("Opción no válida. Elige 1, 2 o 3.")
print(f"Has seleccionado la opción {opcion}")
3. Menús interactivos
El while es perfecto para mantener un menú activo hasta que el usuario decide salir.
print("=== GESTIÓN DE NOTAS ===")
continuar = True
while continuar:
print("\n¿Qué quieres hacer?")
print("1. Añadir nota")
print("2. Ver media")
print("3. Salir")
opcion = input("Opción: ")
if opcion == "1":
nota = float(input("Introduce la nota: "))
print(f"Nota {nota} añadida.")
elif opcion == "2":
print("Calculando media...")
elif opcion == "3":
print("Hasta luego.")
continuar = False
else:
print("Opción no válida.")
El bucle se repite mostrando el menú hasta que el usuario elige la opción 3, momento en que continuar se vuelve False y el bucle termina.
4. Acumuladores — sumar mientras se cumple una condición
# Sumar números hasta que el usuario introduzca 0
print("Introduce números para sumar. Escribe 0 para terminar.")
suma = 0
cantidad = 0
numero = float(input("Número: "))
while numero != 0:
suma += numero
cantidad += 1
numero = float(input("Número: "))
if cantidad > 0:
media = suma / cantidad
print(f"\nNúmeros introducidos: {cantidad}")
print(f"Suma total: {suma:.2f}")
print(f"Media: {media:.2f}")
else:
print("No introdujiste ningún número.")
```
Ejecución:
```
Introduce números para sumar. Escribe 0 para terminar.
Número: 8.5
Número: 6.0
Número: 9.2
Número: 0
Números introducidos: 3
Suma total: 23.70
Media: 7.90
5. Búsqueda — repetir hasta encontrar algo
# Adivina el número secreto
import random
numero_secreto = random.randint(1, 100)
intentos = 0
adivinado = False
print("Adivina el número secreto (entre 1 y 100)")
while not adivinado:
intentos += 1
intento = int(input(f"Intento {intentos}: "))
if intento < numero_secreto:
print("Demasiado bajo, prueba con un número mayor.")
elif intento > numero_secreto:
print("Demasiado alto, prueba con un número menor.")
else:
adivinado = True
print(f"\n¡Correcto! El número era {numero_secreto}.")
print(f"Lo conseguiste en {intentos} intentos.")
```
Ejecución:
```
Adivina el número secreto (entre 1 y 100)
Intento 1: 50
Demasiado alto, prueba con un número menor.
Intento 2: 25
Demasiado bajo, prueba con un número mayor.
Intento 3: 37
Demasiado alto, prueba con un número menor.
Intento 4: 31
¡Correcto! El número era 31.
Lo conseguiste en 4 intentos.
6. Procesamiento de datos hasta una condición
# Registrar alumnos hasta que se introduzca "fin"
alumnos = []
notas = []
print("Registra alumnos y notas. Escribe 'fin' como nombre para terminar.\n")
while True:
nombre = input("Nombre del alumno: ")
if nombre.lower() == "fin":
break
nota = float(input(f"Nota de {nombre}: "))
alumnos.append(nombre)
notas.append(nota)
print(f"✓ {nombre} registrado.\n")
if alumnos:
print("\n=== RESUMEN ===")
for i in range(len(alumnos)):
estado = "Aprobado" if notas[i] >= 5 else "Suspenso"
print(f"{alumnos[i]:<20} {notas[i]:.1f} {estado}")
media = sum(notas) / len(notas)
print(f"\nMedia de la clase: {media:.2f}")
else:
print("No se registró ningún alumno.")
7. Las sentencias break y continue
break — salir del bucle inmediatamente
break interrumpe el bucle en el momento en que se ejecuta, sin esperar a que la condición sea False.
# Buscar el primer número divisible por 7 entre 1 y 100
numero = 1
while numero <= 100:
if numero % 7 == 0:
print(f"El primer múltiplo de 7 es: {numero}")
break
numero += 1
# Sistema de login con máximo de intentos
contrasena_correcta = "python123"
intentos_maximos = 3
intentos = 0
while intentos < intentos_maximos:
intento = input("Introduce la contraseña: ")
intentos += 1
if intento == contrasena_correcta:
print("✓ Acceso concedido.")
break
else:
restantes = intentos_maximos - intentos
if restantes > 0:
print(f"✗ Contraseña incorrecta. Te quedan {restantes} intentos.")
else:
print("✗ Demasiados intentos fallidos. Cuenta bloqueada.")
continue — saltar al siguiente ciclo
continue salta el resto del código del ciclo actual y vuelve directamente a evaluar la condición.
# Procesar solo notas válidas, ignorar las inválidas
print("Introduce notas (0-10). Escribe -1 para terminar.")
notas_validas = []
while True:
entrada = float(input("Nota: "))
if entrada == -1:
break
if entrada < 0 or entrada > 10:
print(f"Nota {entrada} fuera de rango, ignorada.")
continue # vuelve al inicio del bucle sin añadir la nota
notas_validas.append(entrada)
print(f"Nota {entrada} registrada.")
print(f"\nNotas válidas: {notas_validas}")
```
Ejecución:
```
Introduce notas (0-10). Escribe -1 para terminar.
Nota: 8.5
Nota 8.5 registrada.
Nota: 15
Nota 15.0 fuera de rango, ignorada.
Nota: 6.0
Nota 6.0 registrada.
Nota: -1
Notas válidas: [8.5, 6.0]
8. El while con else
Python permite añadir un bloque else al while. Este bloque se ejecuta solo si el bucle terminó de forma natural (la condición se volvió False), pero no si terminó con un break.
# Buscar un alumno en la lista
alumnos = ["Ana", "Carlos", "María", "Pedro"]
buscado = input("¿Qué alumno buscas? ")
indice = 0
while indice < len(alumnos):
if alumnos[indice] == buscado:
print(f"✓ '{buscado}' encontrado en la posición {indice}.")
break
indice += 1
else:
# Solo se ejecuta si el bucle terminó sin break
print(f"✗ '{buscado}' no está en la lista.")
```
Ejecución cuando se encuentra:
```
¿Qué alumno buscas? María
✓ 'María' encontrado en la posición 2.
```
Ejecución cuando no se encuentra:
```
¿Qué alumno buscas? Laura
✗ 'Laura' no está en la lista.
9. Bucles while anidados
Un bucle while dentro de otro. El bucle interior se ejecuta completo en cada iteración del exterior.
# Tabla de multiplicar del 1 al 5
tabla = 1
while tabla <= 5:
numero = 1
print(f"\nTabla del {tabla}:")
while numero <= 10:
print(f" {tabla} x {numero:2} = {tabla * numero:3}")
numero += 1
tabla += 1
# Intentos por nivel en un juego
nivel = 1
while nivel <= 3:
print(f"\n=== NIVEL {nivel} ===")
intentos = 3
while intentos > 0:
respuesta = input(f"Intenta superar el nivel (s para pasar, n para fallar): ")
if respuesta.lower() == "s":
print(f"¡Nivel {nivel} superado!")
break
else:
intentos -= 1
if intentos > 0:
print(f"Fallaste. Te quedan {intentos} intentos.")
else:
print("Sin intentos. Game over.")
if intentos == 0:
break
nivel += 1
if nivel > 3:
print("\n¡Has completado todos los niveles!")
10. Patrones avanzados
Bucle while True con break — la forma más clara de bucle de menú
# El while True crea intencionadamente un bucle infinito
# que solo termina con break. Es un patrón muy común y limpio.
saldo = 1000.0
while True:
print(f"\nSaldo actual: {saldo:.2f} €")
print("1. Ingresar dinero")
print("2. Retirar dinero")
print("3. Salir")
opcion = input("Opción: ")
if opcion == "1":
cantidad = float(input("¿Cuánto quieres ingresar? "))
if cantidad > 0:
saldo += cantidad
print(f"Ingreso realizado. Nuevo saldo: {saldo:.2f} €")
else:
print("La cantidad debe ser positiva.")
elif opcion == "2":
cantidad = float(input("¿Cuánto quieres retirar? "))
if cantidad <= 0:
print("La cantidad debe ser positiva.")
elif cantidad > saldo:
print("Saldo insuficiente.")
else:
saldo -= cantidad
print(f"Retirada realizada. Nuevo saldo: {saldo:.2f} €")
elif opcion == "3":
print("Hasta luego.")
break
else:
print("Opción no válida.")
Bandera booleana — control limpio del bucle
En lugar de usar break, algunas situaciones se leen mejor con una variable booleana que controla cuándo terminar:
juego_activo = True
vidas = 3
puntuacion = 0
while juego_activo:
print(f"\nVidas: {vidas} | Puntuación: {puntuacion}")
accion = input("Acción (jugar/salir): ").lower()
if accion == "jugar":
resultado = input("¿Has ganado la ronda? (s/n): ")
if resultado == "s":
puntuacion += 10
print("¡Ronda ganada! +10 puntos.")
else:
vidas -= 1
print(f"Ronda perdida. Te quedan {vidas} vidas.")
if vidas == 0:
print("Sin vidas. Fin del juego.")
juego_activo = False
elif accion == "salir":
juego_activo = False
else:
print("Acción no reconocida.")
print(f"\nPuntuación final: {puntuacion}")
11. Cuándo usar while y cuándo usar for
Esta es una de las decisiones más frecuentes en Python:
Usa while cuando:
- No sabes cuántas veces se repetirá el bucle
- Necesitas repetir hasta que ocurra algo (el usuario acierte, se encuentre un dato, se cumpla una condición)
- Estás validando entrada de usuario
- Estás implementando un menú interactivo
- La condición de parada depende de algo que ocurre dentro del bucle
Usa for cuando:
- Sabes de antemano cuántas veces se repetirá
- Recorres una lista, un rango de números o cualquier colección
- Quieres iterar sobre cada elemento de algo
# for — sabes que son exactamente 5 notas
notas = [8, 6, 9, 5, 7]
for nota in notas:
print(nota)
# while — no sabes cuántas notas introducirá el usuario
while True:
nota = float(input("Introduce nota (o -1 para terminar): "))
if nota == -1:
break
print(f"Nota registrada: {nota}")
Resumen de todo lo visto
# ESTRUCTURA BÁSICA
while condicion:
codigo_a_repetir
# CON ELSE
while condicion:
codigo_a_repetir
else:
codigo_si_termino_sin_break
# PATRÓN VALIDACIÓN
while True:
dato = input("Introduce dato válido: ")
if es_valido(dato):
break
print("Dato no válido, repite.")
# PATRÓN MENÚ
while True:
mostrar_menu()
opcion = input("Opción: ")
if opcion == "salir":
break
procesar(opcion)
# PATRÓN CONTADOR
contador = valor_inicial
while contador < limite:
hacer_algo()
contador += paso
# PATRÓN ACUMULADOR
total = 0
while hay_datos():
total += siguiente_dato()
Los cinco puntos clave del while: la condición se evalúa antes de cada iteración, si la condición es False desde el principio el bucle no se ejecuta ni una sola vez, siempre debe haber algo dentro del bucle que pueda hacer la condición False, break sale inmediatamente y continue salta al siguiente ciclo, y el bloque else solo se ejecuta si el bucle terminó sin break.
Ejercicios
1.- Pedir un número al usuario y hacer una cuenta regresiva desde ese número
2.- Sumar todos los números pares del 1 al 100 (incluidos)
3.- Mostrar la tabla de multiplicar del 7
4.- Pedir números al usuario hasta que introduzca un 0. Mostrar el número mayor
5.- Escribir un programa que pida nombres y salga cuando escribamos la palabra ‘salir’
6.- Modificar el programa anterior para que salga cuando repitamos el nombre
7.- Escribir un programa que calcule la suma de todos los múltiplos de 5 menores de 100
8.- Pedir un número y calcular el factorial (factorial de 5. 5*4*3*2*1)
9.- Mostrar los cuadrados de los números del 1 al 10