
Después de aprender a tomar decisiones mediante las estructuras condicionales, es el momento de repetir instrucciones de forma automática. En este capítulo aprenderemos a utilizar los bucles while y for, dos estructuras fundamentales que permiten repetir automáticamente un bloque de instrucciones sin tener que escribir el mismo código una y otra vez.
1. ¿Qué es un bucle?
Hasta ahora nuestros programas ejecutaban cada instrucción una sola vez. Sin embargo, en muchos programas necesitamos repetir una misma acción varias veces.
Por ejemplo:
- Mostrar los números del 1 al 10.
- Pedir una contraseña hasta que sea correcta.
- Calcular la suma de varios números.
- Mostrar un menú hasta que el usuario decida salir.
Para realizar este tipo de tareas utilizizamos los bucles, también llamados estructuras de repetición.
Un bucle ejecuta un bloque de instrucciones varias veces hasta que deja de cumplirse una condición o hasta que se han realizado todas las repeticiones previstas.
Por ejemplo, para mostrar los números del 1 al 5 en lugar de escribir:
print(1) print(2) print(3) print(4) print(5)
podemos utilizar un bucle que realice ese trabajo automáticamente.
Con un bucle while:
contador = 1
while contador <= 5:
print(contador)
contador = contador + 1
O con un bucle for:
for numero in range(1, 6):
print(numero)
No te preocupes si todavía no entiendes cómo funcionan estas instrucciones. A lo largo de este capítulo aprenderemos cómo utilizar tanto while como for.
Python dispone principalmente de dos estructuras de repetición: while y for. Aunque ambas permiten repetir instrucciones, cada una está pensada para situaciones diferentes.
- while, cuando no sabemos cuántas veces será necesario repetir las instrucciones y la repetición depende de una condición.
- for, cuando queremos recorrer una secuencia o repetir un bloque un número determinado de veces.
Inicio
│
▼
¿Debe repetirse?
│ │
Sí No
│ │
▼ ▼
Ejecuta Continúa
el bloque el programa
│
└─────────────┐
│
▼
Vuelve a comprobar
la condición
¿Sabías que…? La palabra bucle recibe este nombre porque, al terminar una repetición, el programa vuelve al principio y comprueba si debe ejecutarla otra vez.
2. El bucle while
El bucle while ejecuta un bloque de instrucciones mientras una condición sea verdadera.
Su sintaxis es:
while condicion:
instrucciones
Al igual que ocurre con las estructuras if, la línea termina con dos puntos (:) y el bloque debe escribirse utilizando sangría.
Por ejemplo:
contador = 1
while contador <= 5:
print(contador)
contador = contador + 1
print("Fin del programa")
Resultado:
1 2 3 4 5 Fin del programa
Observa cómo funciona el programa:
- Inicialmente la variable
contadorvale 1. - Python comprueba si
contador <= 5. - Como la condición es
True, ejecuta el bloque. - Incrementa el contador en una unidad.
- Vuelve a comprobar la condición.
- Cuando
contadorpasa a valer 6, la condición deja de cumplirse y el bucle termina.
Inicio
│
▼
contador = 1
│
▼
¿contador <= 5?
│ │
Sí │ │ No
▼ ▼
print(contador) Fin
│
▼
contador = contador + 1
│
▼
Vuelve a comprobar
la condición
En este ejemplo, la variable contador controla cuántas veces se ejecuta el bucle.
Consejo: En la mayoría de los bucles while necesitaremos modificar alguna variable dentro del bloque. Si la condición nunca cambia, el bucle podría ejecutarse indefinidamente.
¿Sabías que…? Un bucle while puede no ejecutarse ninguna vez si la condición es falsa desde el principio.
3. Evitar bucles infinitos
Un bucle infinito es un bucle que nunca termina porque la condición siempre sigue siendo verdadera.
Por ejemplo:
contador = 1
while contador <= 5:
print(contador)
Si ejecutamos este programa, el valor de contador nunca cambia, por lo que la condición contador <= 5 siempre será True.
El resultado será que el programa mostrará continuamente el número 1 hasta que lo detengamos manualmente.
Para evitar este problema, debemos modificar la variable que controla la condición.
La forma correcta sería:
contador = 1
while contador <= 5:
print(contador)
contador = contador + 1
Ahora el valor de contador aumenta en cada repetición. Cuando llega a 6, la condición deja de cumplirse y el bucle finaliza.
Consejo: Siempre que utilices un bucle while, comprueba que existe alguna instrucción que haga cambiar la condición para que el programa pueda terminar.
4. El bucle for
El bucle for permite repetir un bloque de instrucciones un número determinado de veces o recorrer una secuencia de datos.
Su sintaxis es la siguiente:
for variable in secuencia:
instrucciones
Por ejemplo, para mostrar los números del 1 al 5 podemos utilizar la función range().
for numero in range(1, 6):
print(numero)
Resultado:
1 2 3 4 5
Cuando termina una repetición, el bucle asigna automáticamente el siguiente valor y vuelve a ejecutar el bloque.
Observa que, a diferencia del bucle while, no necesitamos crear ni actualizar un contador. El propio bucle se encarga de avanzar automáticamente.
¿Sabías que…? La palabra for puede traducirse como «para cada». En el ejemplo anterior podríamos leer el código como «para cada número comprendido entre 1 y 5, muéstralo por pantalla».
5. La función range()
Como hemos visto en el punto anterior, la función range() genera una secuencia de números que suele utilizarse junto con el bucle for.
Su forma más habitual es:
range(inicio, fin)
El valor inicial sí se incluye, mientras que el valor final no se incluye.
Por ejemplo:
for numero in range(1, 6):
print(numero)
Resultado:
1 2 3 4 5
Aunque el segundo argumento sea 6, el último número mostrado es el 5.
También podemos utilizar range() indicando únicamente el valor final.
for numero in range(5):
print(numero)
Resultado:
0 1 2 3 4
En este caso, range() comienza automáticamente en 0.
Además, podemos indicar un tercer argumento para especificar el incremento entre un número y el siguiente.
for numero in range(2, 11, 2):
print(numero)
Resultado:
2 4 6 8 10
También podemos utilizar un incremento negativo para contar hacia atrás.
for numero in range(5, 0, -1):
print(numero)
Resultado:
5 4 3 2 1
La siguiente tabla resume las formas más habituales de utilizar range().
| Código | Resultado |
|---|---|
range(5) | 0, 1, 2, 3, 4 |
range(1, 6) | 1, 2, 3, 4, 5 |
range(2, 11, 2) | 2, 4, 6, 8, 10 |
range(5, 0, -1) | 5, 4, 3, 2, 1 |
range().¿Sabías que…? range() no genera todos los números de una vez, sino que los va produciendo conforme el bucle los necesita. Gracias a ello puede utilizarse incluso con secuencias muy largas sin consumir mucha memoria.
Consejo: Recuerda que el segundo valor de range() nunca forma parte de la secuencia. Si quieres llegar hasta el 10, deberás escribir range(1, 11).
6. ¿Cuándo utilizar while y cuándo for?
Tanto while como for permiten repetir un bloque de instrucciones, pero cada uno resulta más adecuado en situaciones diferentes.
| Utiliza… | Cuando… |
|---|---|
| while | No sabes cuántas veces será necesario repetir el bloque y la repetición depende de una condición. |
| for | Sabes cuántas repeticiones quieres realizar o necesitas recorrer una secuencia de datos. |
while y cuándo for?Por ejemplo, utilizaríamos while para pedir una contraseña hasta que sea correcta.
contrasena = ""
while contrasena != "python":
contrasena = input("Contraseña: ")
En cambio, utilizaríamos for para mostrar los números del 1 al 10.
for numero in range(1, 11):
print(numero)
Consejo: Como regla general, siempre que conozcas el número de repeticiones, utiliza for. Si la repetición depende de una condición que puede cambiar durante la ejecución, utiliza while.
7. Errores habituales al utilizar bucles
Cuando comenzamos a utilizar bucles es frecuente cometer algunos errores.
| Error | Solución |
|---|---|
Olvidar actualizar la variable de control en un while. | Modificar la variable dentro del bucle para que la condición pueda dejar de cumplirse. |
Escribir range(1, 5) esperando que llegue hasta 5. | Recordar que el último valor de range() no se incluye. |
Olvidar los dos puntos (:) después de while o for. | Añadir : al final de la línea. |
| No escribir la sangría del bloque del bucle. | Indentar las instrucciones con cuatro espacios. |
Consejo: Si un programa parece quedarse bloqueado o no termina nunca, revisa primero la condición del while y comprueba que la variable que la controla cambia durante la ejecución.
Ya sabemos utilizar los bucles while y for para repetir instrucciones. En el siguiente capítulo aprenderemos a desarrollar algoritmos más completos combinando estructuras de control y utilizando instrucciones como break, continue y pass.
8. Actividad
Crea un archivo llamado bucles.py.
Realiza las siguientes tareas:
1. Contar con while
Solicita un número entero positivo.
Si el número es menor que 0, vuelve a pedirlo hasta que sea válido.
Una vez introducido correctamente, muestra todos los números desde 0 hasta ese número utilizando un bucle while.
2. Contar con for
A continuación, muestra los mismos números utilizando un bucle for.
3. Calcular la suma
Utilizando otro bucle for, calcula la suma de todos los números comprendidos entre 1 y el número introducido.
Finalmente muestra el resultado.
Ejemplo de ejecución
Introduce un número: -2 El número debe ser positivo. Introduce un número: 5 Con while: 0 1 2 3 4 5 Con for: 0 1 2 3 4 5 La suma es 15.
9. Prácticas resueltas
Los siguientes ejercicios permiten practicar los conceptos aprendidos en este capítulo. Intenta resolver cada uno antes de consultar la solución.
9.1. Contar del 1 al 10 con while
Crea un programa que muestre los números del 1 al 10 utilizando un bucle while.
Solución
contador = 1
while contador <= 10:
print(contador)
contador = contador + 1
9.2. Mostrar los números pares del 2 al 20 con for
Utiliza un bucle for para mostrar únicamente los números pares entre 2 y 20.
Solución
for numero in range(2, 21, 2):
print(numero)
9.3. Contar hacia atrás con for
Muestra los números del 10 al 1 utilizando un bucle for.
Solución
for numero in range(10, 0, -1):
print(numero)
9.4. Sumar los diez primeros números
Calcula la suma de los números del 1 al 10.
Solución
suma = 0
for numero in range(1, 11):
suma = suma + numero
print("La suma es", suma)
Resultado esperado:
La suma es 55
9.5. Tabla de multiplicar
Solicita un número y muestra su tabla de multiplicar del 1 al 10.
Solución
numero = int(input("Número: "))
for i in range(1, 11):
print(numero, "x", i, "=", numero * i)
Resultado esperado:
Número: 4 4 x 1 = 4 4 x 2 = 8 … 4 x 10 = 40
9.6. Pedir una contraseña
Solicita una contraseña hasta que el usuario escriba python123.
Cuando sea correcta, muestra un mensaje de bienvenida.
Solución
contrasena = ""
while contrasena != "python123":
contrasena = input("Contraseña: ")
if contrasena != "python123":
print("Contraseña incorrecta.")
print("Acceso permitido.")
9.7. Contar números positivos
Solicita números al usuario hasta que escriba 0.
Al finalizar, indica cuántos números positivos ha introducido.
Solución
positivos = 0
numero = int(input("Número (0 para terminar): "))
while numero != 0:
if numero > 0:
positivos = positivos + 1
numero = int(input("Número (0 para terminar): "))
print("Has introducido", positivos, "números positivos.")
9.8. Adivinar el número secreto
El programa guarda un número secreto.
Solicita números al usuario hasta que lo adivine.
Cuando lo consiga, muestra un mensaje indicando que ha acertado.
Solución
secreto = 7
numero = int(input("Adivina el número: "))
while numero != secreto:
if numero < secreto:
print("El número secreto es mayor.")
else:
print("El número secreto es menor.")
numero = int(input("Prueba otra vez: "))
print("¡Enhorabuena! Has acertado.")
9.9. Contar números pares
Solicita diez números al usuario.
Al finalizar, indica cuántos de ellos son pares.
pares = 0
for i in range(10):
numero = int(input("Número: "))
if numero % 2 == 0:
pares = pares + 1
print("Has introducido", pares, "números pares.")
10. Test de autoevaluación: Bucles en Python (while y for)
Comprueba si has comprendido los conceptos principales de este capítulo respondiendo al siguiente test. Si alguna respuesta no es correcta, revisa el apartado correspondiente antes de continuar con el siguiente tema.
10.1. ¿Para qué se utiliza un bucle en Python?
- a) Para crear variables.
- b) Para repetir un bloque de instrucciones. ✅
- c) Para almacenar datos.
- d) Para escribir comentarios.
Retroalimentación: Los bucles permiten ejecutar varias veces un mismo bloque de código sin repetir las instrucciones manualmente.
10.2. ¿Qué estructura es más adecuada cuando no sabemos cuántas veces habrá que repetir una acción?
- a) for
- b) while ✅
- c) if
- d) elif
Retroalimentación: while repite las instrucciones mientras una condición siga siendo verdadera.
10.3. ¿Qué estructura suele utilizarse cuando conocemos el número de repeticiones?
- a) if
- b) while
- c) for ✅
- d) else
Retroalimentación: for es la opción habitual cuando conocemos el número de iteraciones o recorremos una secuencia.
10.4. ¿Qué mostrará el siguiente programa?
for numero in range(1, 4):
print(numero)
- a) 1 2 3 ✅
- b) 1 2 3 4
- c) 0 1 2 3
- d) 0 1 2
Retroalimentación: range(1, 4) genera los valores 1, 2 y 3.
10.5. ¿Qué mostrará este programa?
for numero in range(5):
print(numero)
- a) 1 2 3 4 5
- b) 0 1 2 3 4 ✅
- c) 0 1 2 3 4 5
- d) 5
Retroalimentación: Si solo indicamos un valor, range() comienza en 0.
10.6. ¿Qué mostrará este programa?
contador = 1
while contador <= 3:
print(contador)
contador = contador + 1
- a) 1 2 3 ✅
- b) 0 1 2
- c) 1 2
- d) Bucle infinito
Retroalimentación: El contador aumenta en cada repetición hasta que la condición deja de cumplirse.
10.7. ¿Qué ocurre si olvidamos incrementar la variable de control en un bucle while?
- a) El programa termina antes.
- b) Se produce un SyntaxError.
- c) Puede producirse un bucle infinito. ✅
- d) El programa se ejecuta una sola vez.
Retroalimentación: Si la condición nunca cambia, el bucle puede repetirse indefinidamente.
10.8. ¿Qué genera la expresión range(2, 11, 2)?
- a) 2, 3, 4, 5, 6
- b) 2, 4, 6, 8, 10 ✅
- c) 2, 4, 6, 8, 10, 12
- d) 1, 3, 5, 7, 9
Retroalimentación: El tercer argumento indica el incremento entre valores.
10.9. ¿Qué mostrará este programa?
for numero in range(5, 0, -1):
print(numero)
- a) 5 4 3 2 1 ✅
- b) 5 4 3 2 1 0
- c) 4 3 2 1
- d) Error
Retroalimentación: El último valor de range() nunca se incluye.
10.10. ¿Qué afirmación sobre range() es correcta?
- a) El último valor sí se incluye.
- b) Siempre empieza en 1.
- c) El último valor no se incluye. ✅
- d) Solo puede utilizarse con while.
Retroalimentación: El segundo argumento marca el límite superior, pero no forma parte de la secuencia.
10.11. ¿Qué hace este código?
for i in range(3):
print("*")
- a) Muestra tres asteriscos. ✅
- b) Muestra un único asterisco.
- c) Muestra cuatro asteriscos.
- d) Produce un error.
Retroalimentación: El bucle se ejecuta tres veces.
10.12. ¿Cuál es la función de la variable contador en un bucle while?
- a) Guardar texto.
- b) Controlar las repeticiones del bucle. ✅
- c) Mostrar resultados.
- d) Crear condiciones.
Retroalimentación: Habitualmente un contador permite controlar cuándo debe terminar el bucle.
10.13. ¿Cuál de estos fragmentos contiene un error?
- a)
while numero < 10:
numero = numero + 1
- b)
for i in range(5):
print(i)
- c)
for i range(5):
print(i)
✅
- d)
while True:
break
Retroalimentación: En un bucle for es obligatorio escribir la palabra in.
10.14. ¿Qué estructura utilizarías para pedir una contraseña hasta que sea correcta?
- a) for
- b) while ✅
- c) elif
- d) range()
Retroalimentación: No sabemos cuántos intentos necesitará el usuario.
10.15. ¿Cuál de las siguientes afirmaciones es verdadera?
- a) while siempre se ejecuta al menos una vez.
- b) for necesita actualizar manualmente un contador.
- c) Un bucle while puede no ejecutarse ninguna vez si la condición es falsa desde el principio. ✅
- d) range() solo admite dos parámetros.
Retroalimentación: Si la condición inicial de un while es falsa, el bloque nunca llega a ejecutarse.
11. Actividad de ampliación
Descubre otros usos de los bucles
En este capítulo hemos utilizado los bucles para repetir instrucciones y mostrar secuencias de números. Sin embargo, los bucles también permiten resolver problemas mucho más complejos.
Investiga otros usos de los bucles en programación y responde a las siguientes preguntas:
- ¿En qué situaciones se utilizan habitualmente los bucles?
- Busca un ejemplo de programa que utilice un bucle para realizar una tarea diferente a las vistas en este capítulo.
- Explica con tus palabras qué hace ese programa.
- ¿Crees que sería posible resolver ese problema sin utilizar un bucle? Justifica tu respuesta.
Puedes consultar la documentación oficial de Python para conocer más ejemplos de utilización de los bucles:
Objetivo: comprender que los bucles son una herramienta fundamental para automatizar tareas repetitivas y descubrir nuevas aplicaciones más allá de los ejemplos trabajados en este capítulo.