Bucles en Python
¿Qué son los bucles?
Los bucles permiten repetir un bloque de código múltiples veces. Son fundamentales para automatizar tareas repetitivas sin tener que escribir el mismo código una y otra vez.
Imaginemos la situación en la que queremos imprimir los números del 0 al 10. Con los conocimientos actuales escribiríamos lo siguiente:
print(0)
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)
# Resultado:
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
Sin embargo esto no es nada óptimo, ya que si quisiésemos hacer esto mismo para los números del 1 al 10000 nos sería imposible.
Bucle for
El bucle for se utiliza principalmente para recorrer secuencias desde el principio hasta el final (listas, cadenas, rangos, etc.) y ejecutar un bloque de código para cada elemento.
La sintaxis general del bucle es for i in secuencia:.
for i in secuencia:
# código que se repite
Veamos un ejemplo para entender esa i ( también llamada variable iteradora ): imaginemos que tenemos una lista de nombres de personas, y para cada uno de ellos queremos imprimir el mensaje Hola {nombre}.
nombres = ["Pepe", "Juan", "Ernesto", "Anna", "Aitana"]
for i in nombres:
print("Hola", i)
# Resultado
# Hola Pepe
# Hola Juan
# Hola Ernesto
# Hola Anna
# Hola Aitana
La variable i es una variable auxiliar que va a ir cambiando su valor. Sirve para apuntar cada vez al elemento de la secuencia con el que estamos trabajando.
Inicialmente la i equivaldrá al primer elemento de la lista ("Pepe"), e irá cambiando su valor de izquierda a derecha recorriendo los elementos de la lista.
El orden de ejecución en un bucle for es:
- La variable
i= primer elemento --> Este casoi= "Pepe" - Se ejecuta el código de "dentro" del bucle
for--> En este casoprint("Hola Pepe"), ya quei= "Pepe" - Cuando termina el código de dentro del bucle, la
iavanza al siguiente elemento --> Ahorai= "Juan" - Vuelve a ejecutar el código de dentro --> "Hola Juan"
- La
iavanza ai= Ernesto - "Hola Ernesto"
- ...
Es muy importante tener en cuenta que solamente el código tabulado a la derecha abajo del for está ligado al bucle. Podemos poner tantas líneas de código como queramos.
nombres = ["Pepe", "Juan", "Ernesto", "Anna", "Aitana"]
for i in nombres:
print("Hola " + i)
print("Adiós " + i)
# Resultado
# Hola Pepe
# Adiós Pepe
# Hola Juan
# Adiós Juan
# Hola Ernesto
# Adiós Ernesto
# Hola Anna
# Adiós Anna
# Hola Aitana
# Adiós Aitana
Además, no tenemos por que llamarla siempre i. Simplemente python tomará como variable iteradora aquella que pongamos entre el for y el in.
for elemento in lista:
print(elemento)
for nombre in lista:
print(nombre)
for en Listas
El comportamiento de un bucle for varía ligeramente dependiendo de la secuencia que se recorra.
Hemos visto que cuando se recorren listas, la variable iteradora equivale a cada uno de los elementos desde el primero hasta el último.
Por ejemplo, imprimamos todas las frutas una lista.
frutas = ["manzana", "banana", "naranja"]
for fruta in frutas:
print(fruta)
# Resultado:
# manzana
# banana
# naranja
for en Texto
Cuando usamos un bucle for para recorrer un texto, la variable iteradora equivale a cada una de las letras del texto.
palabra = "Python"
for letra in palabra:
print(letra)
# Resultado:
# P
# y
# t
# h
# o
# n
for con range()
Hemos visto cómo recorrer listas y textos, pero ¿qué hay del ejercicio del principio donde queremos mostrar los números del 0 al 10 de manera automática?
La función range() es muy utilizada cuando queremos crear una secuencia de números. O lo que es lo mismo: repetir el mismo código x veces.
Tres formas de usar range():
Forma 1: range(fin)
Genera números desde 0 hasta fin-1.
for i in range(11):
print(i)
# Resultado:
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
Si lo pensamos, los range() nos sirven también para repetir una instrucción tantas veces como se indica en el paréntesis. Esto ocurre porque internamente el bucle for itera desde el 0 hasta el fin, lo cual se puede aprovechar para repetir instrucciones.
Como vemos en el siguiente ejemplo, aunque sea necesaria la i para el bucle, no la utilizamos en el código de dentro del for.
for i in range(5):
print("Hola")
# Resultado:
# Hola
# Hola
# Hola
# Hola
# Hola
Forma 2: range(inicio, fin)
Genera números desde inicio hasta fin-1.
for i in range(3, 8):
print(i)
# Resultado:
# 3
# 4
# 5
# 6
# 7
Forma 3: range(inicio, fin, paso)
Genera números desde inicio hasta fin-1 aumentando de paso en paso.
for i in range(0, 10, 2): # del 0 al 9 de 2 en 2
print(i)
# Resultado:
# 0
# 2
# 4
# 6
# 8
Esta tercera forma es muy útil para contar hacia atrás, ya que los range() solo permiten secuencias crecientes de base.
for i in range(10, 2):
print(i)
# ERROR: no funcionan los rangos decrecientes
La estructura para contar hacia atrás es range(inicio, fin, -1).
for i in range(5, 0, -1):
print(i)
# Resultado:
# 5
# 4
# 3
# 2
# 1
Extras bucles for
Muchas veces los bucles for() van acompañados de contadores o sumatorios.
Contadores
Imaginemos que tenemos una lista de palabas y queremos saber cuántas veces aparece la palabra "patata". Podemos aprovechar un bucle for para recorrer la lista y para cada uno de sus elementos ejecutar la misma instrucción: comprobar si ese elemento es "patata".
La estructura que siguen los problemas que requieren de contador es la siguiente:
contador = 0 # inicializamos el contador a 0 siempre
for elemento in lista: # recorremos los elementos de la lista
# cualquier codigo
if condicion:
contador += 1 # añadimos 1 al contador cada vez que se cumpla la condición que quermos
Para nuestro ejemplo de "patata", ésta sería la solución.
contador = 0
lista = ["patata", "huevos", "miel", "mostaza", "patata", "comino", "patata"]
for elem in lista:
if elem == "patata":
contador += 1
print(contador) # 3 veces
Sumatorios
Otro de los problemas básicos que nos encontramos es acumular el contenido de listas o secuencias. Por ejemplo, necesitamos sumar todos los números de una lista. La lista = [2,3,4,1] daría 2+3+4+1 = 10.
Éste es un ejemplo típico de sumatorios o acumladores, y siempre siguen esta estructura (muy parecida a la de los contadores):
acumulador = 0 # inicializamos la suma a 0 siempre
for elemento in lista:
# codigo
acumulador += elemento # acumulamos el elemento
Si nos fijamos, la estructura es muy similar a la de "contadores". La única diferencia es que en "contadores" siempre sumamos 1 al contador, mientras que en "sumatorio" sumamos al contador un valor.
Para nuestro problema la solución sería:
lista = [2,3,4,1]
suma = 0
for elemento in lista:
suma += elemento
print(suma)
Obviamente, dentro del bucle podemos añadir tantos detalles como queramos. Por ejemplo, sumar solamente los números menores a 4.
lista = [2,3,4,7,2,12]
suma = 0
for elemento in lista:
if elemento < 4:
suma += elemento
print(suma) # 7
Bucle while
Los bucles for se usan cuando queremos recorrer algo desde un principio hasta un fin:
- Las letras de una palabra
- Los elementos de una lista
- Un rango de números
Sin embargo, la lógica del bucle while es que se ejecuta mientras una condición sea verdadera (True). Es decir, no tiene un inicio y un fin predeterminado. Su repetición se basará en que una condición se cumpla o no.
La sintaxis básica es:
while condicion:
# código que se repite
Vamos a trasladar el ejemplo de contasr hasta 5 desde un bucle for a la estructura del while.
for i in range(1,6):
print(i)
# Resultado
# 1
# 2
# 3
# 4
# 5
Versión while:
i = 1
while i < 6:
print(i)
i = i + 1 # ¡IMPORTANTE! Modificar la condición
# Resultado
# 1
# 2
# 3
# 4
# 5
¿Qué hace el bucle while?
Evalúa si la condición es cierta.
- Si es cierta, entra en el bucle
- Sino lo es, termina
En este caso empezamos con una i = 1 (ya que vamos a contar desde el 1 al 5). Queremos que siga aumentando la i hasta que llegue a 5, por eso la condición del bucle es while i <= 5, puesto que mientras que la i no llegue a 5 la seguiremos incrementando.
En estos casos es muy importante que en cada iteración incrementemos la i con i += 1, ya que si no lo hacemos nunca llegaría a 5 puesto que se quedaría estancada en el i = 1 inicial.
Como habrás podido deducir, en este tipo de casos es mucho más útil utilizar directamente un bucle for.
Veámos un ejemplo donde es while se vuelve relevante:
Queremos hacer un programa donde el usuario introduzca una contraseña. Si el usuario hacierta la contraseña el programa parará. En cambio, si falla la contraseña, el programa continuará preguntando una y otra vez hasta que la acierte.
contrasenya_correcta = "Hola1234"
contrasenya_usuario = input("Introduzca la contraseña: ")
while contrasenya_correcta != contrasenya_usuario:
contrasenya_usuario = input("ERROR: Introduzca la contraseña: ")
print("FIN")
# Respuesta:
# Introduzca la contraseña: Hola
# ERROR: Introduzca la contraseña: Pepino12
# ERROR: Introduzca la contraseña: Juan222
# ERROR: Introduzca la contraseña: Hola1234
# FIN
En este ejemplo vemos como el programa seguirá pidiendo al usuario que vuelva a introducir la contraseña mientras no sea igual que la contraseña correcta.
Es aquí donde se vuelve relevante un while, cuando no sabemos de antemano cuándo terminarña el bucle.
Control de bucles: break, continue y pass
Instrucción break: salir del bucle inmediatamente
Podemos encontrarnos con situaciones (tanto en for como en while) en las que queremos que el bucle termine antes si se cumple cierta condición. En estos casos en los que queremos terminar el bucle (independientemente de lo que quede pendiente) utilizamos el break.
Por ejemplo, queremos recorrer una lista en busca de la palabra "sacapuntas". Cuando encontremos la palabra, ya no querremos seguir buscando más en lo que queda de lista.
Si dejamos el código tal que así:
palabras = ["lapiz", "papel", "sacapuntas", "folio", "boli"]
for i in palabra:
if i == "sacapuntas":
print("Sacapuntas encontrado!")
Habremos indicado que hemos encontrado el "sacapuntas" pero igualmente el bucle llegará hasta el final de la lista comprobando si el resto de elementos son "sacapuntas".
En cambio, si colocamos un break dentro de la condición, el bucle terminará nada más encontrar el "sacapuntas" y no comprobará innecesariamente el resto de elementos restantes.
palabras = ["lapiz", "papel", "sacapuntas", "folio", "boli"]
for i in palabra:
if i == "sacapuntas":
print("Sacapuntas encontrado!")
break
Instrucción continue: saltar a la siguiente iteración
No siempre queremos ejecutar todas las intrucciones del bucle para todos los elementos o en todas las iteraciones. El continue nos ayudará a saltar a la siguiente iteración sin ejecutar el código que haya más abajo.
Imaginemos que tenemos una lista de personas, y queremos saludarlas a todas con un Hola {nombre} menos a aquellas cuyo nombre empiece por "M". Podemos para ello hacer uso del continue, de manera que para éstas personas no ejecute el saludo.
personas = ["Erik", "Maria", "Manolo", "Eric", "Estela", "Miguel", "Pau"]
for nombre in personas:
if nombre[0] == "M": # si la primera letra del nombre es la M
continue
print("Hola", nombre)
# Resultado:
# Hola Erik
# Hola Eric
# Hola Estela
# Hola Pau
Como vemos solo imprime el saludo para aquellos nombres que no empiezan por M, ya que esos "se los salta" con el continue.
Instrucción pass: No hacer nada
La intrucción pass es muy utilizada cuando estamos empezando a estructurar nuestro código pero aún no lo tenemos completo. Allí donde coloquemos un pass ayudará a que no haya errores de sintaxis si el código no está completo.
for i in range(3):
pass # No hace nada, pero evita errores de sintaxis
Bucles while infinitos
La intrucción break suele acompañar a bucles while infinitos.
Qué es un while infinito?
Un bucle infinito es un bucle que nunca termina por sí solo. Continúa ejecutándose indefinidamente porque la condición para salir nunca se cumple. Generalmente tienen esta pinta:
while True: # Nunca termina porque la condición siempre se evaluá como verdadera o True
# codigo
La combinación break+ while True es una forma muy utilizada en programación. Su estructura básica es:
while True: # Bucle infinito
# código
if condicion_para_salir:
break # Rompe el bucle
Es decir, en lugar de escribir la condición del while, escribimos un while True y ponemos la condición de salida dentro del bucle junto a un break.
Por ejemplo sería lo mismo escribir esto:
i = 0
while i < 5:
print(i)
i += 1
Que esto:
i = 0
while True:
print(i)
if i == 5:
break
Esta técnica (while True + breal) es muy utilizada cuando puede haber varias condiciones de salida.
Imaginemos un programa que pide un número y una letra. Si el número es 2 o 5 queremos terminar el bucle. Pero si la letra es "j" o "v" o "h" también queremos terminarlo. Pero también, si el número es 3 y la letra "b" queremos terminar. Podríamos escribir todas esas condiciones en el while:
letra = input('Dime la letra: ')
numero = int(input('Dime el número: '))
while letra != "j" and letra != "v" and letra != "h" and numero != 2 and numero != 5 and (letra != "b" and numero != 3):
letra = input('Dime la letra: ')
numero = int(input('Dime el número: '))
Pero como vemos nos quedaría una condición demasiado larga y poco organizada. Si recurrimos a la combinación while True+ break, nos quedaría mucho más legible e intruitivo:
letra = input('Dime la letra: ')
numero = int(input('Dime el número: '))
while True:
if letra == "j" or letra == "v" or letra == "h":
break
if numero == 2 or numero == 5:
break
if numero == 3 and letra == "b":
break
letra = input('Dime la letra: ')
numero = int(input('Dime el número: '))
Ejercicios para practicar
Ejercicio 1: Suma números hasta "stop"
Necesitamos un programa que empezando en 0 y creciendo de dos en dos (0, 2, 4, 6, 8, ...) vaya acumulando la suma hasta el usuario introduzca la palabra "STOP".
PISTA: utiliza el input() para preguntar al usuario si quiere seguir.
suma = 0
i = 0
while True: # bucle infinito, no termina hasta el break
pregunta = input("Dale al Enter para seguir o introduce STOP para salir: ")
if pregunta == "STOP": # si la respuesta el STOP salir del bucle
break
suma += i # acumulo el número en la suma
i += 2 # incremento el número de dos en dos cada vez
print("La suma es", suma) # al finalizar el bucle muestra la suma acumulada
# Respuesta
# Dale al Enter para seguir o introduce STOP para salir:
# Dale al Enter para seguir o introduce STOP para salir:
# Dale al Enter para seguir o introduce STOP para salir:
# Dale al Enter para seguir o introduce STOP para salir:
# Dale al Enter para seguir o introduce STOP para salir: STOP
# La suma es 12
Ejercicio 2: número divisible por 7
Encuentra en la siguiente secuencia, los números divisibles por 7 y guárdalos en otra lista.
numeros = [15, 8, 22, 35, 9, 14, 12]
numeros = [15, 8, 22, 35, 9, 14, 12]
solucion = []
for i in numeros:
if i % 7 == 0: # divisible por 7
solucion.append(i)
print(solucion)
# Resultado:
# [35, 14]
Ejercicio 3: pares e impares
Dada una lista de números, crea una lista con los impares y otra con los pares.
# Solución
numeros = [3, 7, 2, 8, 5, 12, 9, 6]
pares = []
impares = []
for num in numeros:
if num % 2 == 0:
pares.append(num)
else:
impares.append(num)
print(f"Números pares: {pares}")
print(f"Números impares: {impares}")
Ejercicio 4: Menú de opciones
Crea un menú de opciones donde solicites al usuario que elija una opción:
- 1: sumar
- 2: restar
- 3: multiplicar
- 4: salir
Cuando haya elegido la opción, el programa debe pedirle al usuario dos números, y una vez introducidos hacer con ellos la operación previamente seleccionada (sumar, restar o multiplicar).
Una vez terminada la operación, el programa debe volver a preguntar y seguir hasta que el usuario dese "salir".
Un ejemplo de ejecución sería el siguiente:
OPCIONES: 1 - SUMAR 2 - RESTAR 3 - MULTIPLICAR 4 - SALIR Introduce una opicón: 2 Introduce el primer número: 7 Introduce el segundo número: 3 el resultado es 4 Introduce una opicón: 1 Introduce el primer número: 5 Introduce el segundo número: 5 el resultado es 10 Introduce una opicón: 3 Introduce el primer número: 2 Introduce el segundo número: 3 el resultado es 6 Introduce una opicón: 4
print("OPCIONES:")
print("1 - SUMAR")
print("2 - RESTAR")
print("3 - MULTIPLICAR")
print("4 - SALIR")
opcion = input("Introduce una opicón: ")
while True:
if opcion == 4:
break
elif opcion == 1:
numero1 = int(input("Introduce el primer número: "))
numero2 = int(input("Introduce el segundo número: "))
print("el resultado es", numero1 + numero2)
elif opcion == 2:
numero1 = int(input("Introduce el primer número: "))
numero2 = int(input("Introduce el segundo número: "))
print("el resultado es", numero1 - numero2)
elif opcion == 2:
numero1 = int(input("Introduce el primer número: "))
numero2 = int(input("Introduce el segundo número: "))
print("el resultado es", numero1 * numero2)
opcion = input("Introduce una opicón: ") # vuelve a preguntar