Bucle for
El Bucle for en Python
Qué es el bucle for
El bucle for repite un bloque de código para cada elemento de una secuencia. A diferencia del while, que se repite mientras una condición sea verdadera, el for sabe de antemano sobre qué va a iterar: una lista, un rango de números, un texto, un diccionario o cualquier objeto que sea iterable.
La idea fundamental es: para cada elemento de esta colección, haz esto.
Estructura básica
for variable in secuencia:
# código que se ejecuta una vez por cada elemento
# variable toma el valor de cada elemento en cada iteración
En cada iteración variable toma automáticamente el valor del siguiente elemento de la secuencia. No necesitas gestionar ningún contador ni incrementar nada manualmente.
frutas = ["manzana", "pera", "naranja", "uva"]
for fruta in frutas:
print(fruta)
```
Salida:
```
manzana
pera
naranja
uva
Python toma el primer elemento ("manzana"), lo asigna a fruta y ejecuta el bloque. Luego toma el segundo ("pera"), lo asigna a fruta y ejecuta el bloque. Y así hasta el último.
1. Iterar sobre listas
La iteración sobre listas es el uso más frecuente del for.
Recorrer una lista de valores
notas = [8.5, 6.0, 9.2, 4.8, 7.5]
for nota in notas:
print(nota)
Procesar cada elemento
notas = [8.5, 6.0, 9.2, 4.8, 7.5]
for nota in notas:
if nota >= 5:
estado = "Aprobado"
else:
estado = "Suspenso"
print(f"Nota {nota} → {estado}")
```
Salida:
```
Nota 8.5 → Aprobado
Nota 6.0 → Aprobado
Nota 9.2 → Aprobado
Nota 4.8 → Suspenso
Nota 7.5 → Aprobado
Acumular valores
notas = [8.5, 6.0, 9.2, 4.8, 7.5]
suma = 0
for nota in notas:
suma += nota
media = suma / len(notas)
print(f"Media: {media:.2f}") # Media: 7.20
Construir una nueva lista
precios = [100, 250, 80, 320, 150]
precios_con_iva = []
for precio in precios:
precio_iva = precio * 1.21
precios_con_iva.append(precio_iva)
print(precios_con_iva)
# [121.0, 302.5, 96.8, 387.2, 181.5]
2. La función range() — generar secuencias de números
range() genera una secuencia de números sin necesidad de crearla manualmente. Es la herramienta principal para repetir algo un número determinado de veces.
range(n) — del 0 al n-1
for i in range(5):
print(i, end=" ")
# 0 1 2 3 4
Genera números desde 0 hasta n-1. Si quieres contar del 1 al 5 en lugar del 0 al 4, puedes sumarle 1 al usar la variable:
for i in range(5):
print(i + 1, end=" ")
# 1 2 3 4 5
range(inicio, fin) — de inicio a fin-1
for i in range(1, 6):
print(i, end=" ")
# 1 2 3 4 5
for i in range(10, 16):
print(i, end=" ")
# 10 11 12 13 14 15
El número de inicio está incluido, el de fin no. range(1, 6) genera 1, 2, 3, 4, 5 pero no el 6.
range(inicio, fin, paso) — con paso personalizado
# De 2 en 2
for i in range(0, 11, 2):
print(i, end=" ")
# 0 2 4 6 8 10
# De 5 en 5
for i in range(0, 51, 5):
print(i, end=" ")
# 0 5 10 15 20 25 30 35 40 45 50
# De 3 en 3 desde 1
for i in range(1, 20, 3):
print(i, end=" ")
# 1 4 7 10 13 16 19
range() con paso negativo — contar hacia atrás
# Cuenta atrás del 10 al 1
for i in range(10, 0, -1):
print(i, end=" ")
# 10 9 8 7 6 5 4 3 2 1
# Del 20 al 0 de dos en dos
for i in range(20, -1, -2):
print(i, end=" ")
# 20 18 16 14 12 10 8 6 4 2 0
Usar range() para repetir sin importar el índice
A veces solo quieres repetir algo N veces y no te importa el número de iteración. La convención es usar _ como nombre de variable:
for _ in range(5):
print("Python mola")
# Imprime "Python mola" cinco veces
3. Iterar sobre strings
Los strings son secuencias de caracteres y se pueden recorrer con for.
palabra = "Python"
for letra in palabra:
print(letra)
```
Salida:
```
P
y
t
h
o
n
Aplicaciones prácticas
# Contar vocales
texto = "Programación en Python"
vocales = 0
for letra in texto:
if letra.lower() in "aeiouáéíóú":
vocales += 1
print(f"Vocales: {vocales}") # Vocales: 8
# Construir string modificado
nombre = "ana garcia"
nombre_formateado = ""
for letra in nombre:
if letra == " ":
nombre_formateado += " "
else:
nombre_formateado += letra.upper() if nombre_formateado == "" or nombre_formateado[-1] == " " else letra
print(nombre_formateado) # Ana Garcia
4. La función enumerate() — índice y valor a la vez
enumerate() devuelve en cada iteración tanto el índice de la posición como el valor del elemento. Evita tener que mantener un contador manual.
# Sin enumerate — necesitas un contador manual
frutas = ["manzana", "pera", "naranja"]
i = 0
for fruta in frutas:
print(f"{i}: {fruta}")
i += 1
# Con enumerate — mucho más limpio
for i, fruta in enumerate(frutas):
print(f"{i}: {fruta}")
```
Salida:
```
0: manzana
1: pera
2: naranja
Empezar el índice desde un número distinto de 0
alumnos = ["Ana", "Carlos", "María", "Pedro"]
for numero, alumno in enumerate(alumnos, start=1):
print(f"Alumno {numero}: {alumno}")
```
Salida:
```
Alumno 1: Ana
Alumno 2: Carlos
Alumno 3: María
Alumno 4: Pedro
Uso práctico con notas
notas = [8.5, 4.8, 9.2, 6.0, 7.5]
alumnos = ["Ana", "Carlos", "María", "Pedro", "Lucía"]
print("Listado de notas:")
for i, nota in enumerate(notas):
estado = "✓" if nota >= 5 else "✗"
print(f" {i+1}. {alumnos[i]:<10} {nota:.1f} {estado}")
```
Salida:
```
Listado de notas:
1. Ana 8.5 ✓
2. Carlos 4.8 ✗
3. María 9.2 ✓
4. Pedro 6.0 ✓
5. Lucía 7.5 ✓
5. La función zip() — recorrer varias listas a la vez
zip() combina varias listas y en cada iteración entrega un elemento de cada una simultáneamente.
nombres = ["Ana", "Carlos", "María"]
notas = [8.5, 4.8, 9.2]
ciudades = ["Madrid", "Barcelona", "Valencia"]
for nombre, nota, ciudad in zip(nombres, notas, ciudades):
print(f"{nombre} ({ciudad}): {nota}")
```
Salida:
```
Ana (Madrid): 8.5
Carlos (Barcelona): 4.8
María (Valencia): 9.2
Si las listas tienen distinto tamaño, zip() se detiene en la más corta:
letras = ["a", "b", "c", "d", "e"]
numeros = [1, 2, 3]
for l, n in zip(letras, numeros):
print(l, n)
# a 1
# b 2
# c 3 ← se detiene aquí porque numeros solo tiene 3 elementos
6. Iterar sobre diccionarios
Los diccionarios tienen varias formas de iteración.
Iterar sobre las claves (por defecto)
alumno = {"nombre": "Ana", "edad": 22, "nota": 8.5}
for clave in alumno:
print(clave)
# nombre
# edad
# nota
Iterar sobre los valores con .values()
for valor in alumno.values():
print(valor)
# Ana
# 22
# 8.5
Iterar sobre clave y valor con .items()
for clave, valor in alumno.items():
print(f"{clave}: {valor}")
# nombre: Ana
# edad: 22
# nota: 8.5
Ejemplo práctico con diccionario de diccionarios
alumnos = {
"ana": {"nota": 8.5, "ciudad": "Madrid"},
"carlos": {"nota": 4.8, "ciudad": "Barcelona"},
"maría": {"nota": 9.2, "ciudad": "Valencia"},
}
for nombre, datos in alumnos.items():
estado = "Aprobado" if datos["nota"] >= 5 else "Suspenso"
print(f"{nombre.capitalize():<10} {datos['nota']} {datos['ciudad']:<12} {estado}")
```
Salida:
```
Ana 8.5 Madrid Aprobado
Carlos 4.8 Barcelona Suspenso
María 9.2 Valencia Aprobado
7. break y continue en el for
Funcionan igual que en el while.
break — salir del bucle antes de terminar
# Buscar el primer suspenso
notas = [8.5, 7.0, 9.2, 4.8, 6.5]
for i, nota in enumerate(notas):
if nota < 5:
print(f"Primer suspenso en posición {i}: {nota}")
break
# Primer suspenso en posición 3: 4.8
continue — saltar al siguiente elemento
# Procesar solo las notas aprobadas
notas = [8.5, 4.8, 9.2, 3.0, 7.5]
print("Notas aprobadas:")
for nota in notas:
if nota < 5:
continue # salta al siguiente sin ejecutar el print
print(f" {nota} ✓")
```
Salida:
```
Notas aprobadas:
8.5 ✓
9.2 ✓
7.5 ✓
8. El for con else
Igual que el while, el for puede tener un bloque else que se ejecuta solo si el bucle terminó de forma natural, sin break.
# Comprobar si todos los alumnos aprobaron
notas = [8.5, 7.0, 9.2, 6.5, 8.0]
for nota in notas:
if nota < 5:
print(f"Hay suspensos (nota {nota})")
break
else:
print("Todos los alumnos han aprobado")
# Todos los alumnos han aprobado
# Si hay algún suspenso el else no se ejecuta
notas = [8.5, 7.0, 4.2, 6.5, 8.0]
for nota in notas:
if nota < 5:
print(f"Hay suspensos (nota {nota})")
break
else:
print("Todos los alumnos han aprobado")
# Hay suspensos (nota 4.2)
9. Bucles for anidados
Un for dentro de otro. El interior se ejecuta completo en cada iteración del exterior.
Tablas de multiplicar
for tabla in range(1, 6):
print(f"\nTabla del {tabla}:")
for numero in range(1, 11):
print(f" {tabla} x {numero:2} = {tabla * numero:3}")
Matriz — estructura en filas y columnas
# Crear y mostrar una matriz 3x3
filas = 3
columnas = 3
for fila in range(filas):
for columna in range(columnas):
print(f"[{fila},{columna}]", end=" ")
print() # salto de línea al terminar cada fila
```
Salida:
```
[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]
[2,0] [2,1] [2,2]
Combinaciones de elementos
colores = ["rojo", "verde", "azul"]
tallas = ["S", "M", "L"]
for color in colores:
for talla in tallas:
print(f"{color}-{talla}", end=" ")
print()
```
Salida:
```
rojo-S rojo-M rojo-L
verde-S verde-M verde-L
azul-S azul-M azul-L
10. Comprensiones de lista — for en una línea
Las comprensiones de lista son una forma concisa y muy pythónica de crear listas usando un for en una sola línea.
Sintaxis básica
# Forma larga con for
cuadrados = []
for n in range(1, 6):
cuadrados.append(n ** 2)
# Comprensión de lista — mismo resultado en una línea
cuadrados = [n ** 2 for n in range(1, 6)]
print(cuadrados) # [1, 4, 9, 16, 25]
Con condición
# Solo los números pares del 1 al 20
pares = [n for n in range(1, 21) if n % 2 == 0]
print(pares) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# Solo las notas aprobadas
notas = [8.5, 4.8, 9.2, 3.0, 7.5, 5.0]
aprobadas = [nota for nota in notas if nota >= 5]
print(aprobadas) # [8.5, 9.2, 7.5, 5.0]
Con transformación
# Convertir todas las palabras a mayúsculas
palabras = ["python", "es", "genial"]
mayusculas = [p.upper() for p in palabras]
print(mayusculas) # ['PYTHON', 'ES', 'GENIAL']
# Aplicar IVA a todos los precios
precios = [100, 250, 80, 320]
con_iva = [round(p * 1.21, 2) for p in precios]
print(con_iva) # [121.0, 302.5, 96.8, 387.2]
Con condición y transformación
# Si aprueba muestra la nota, si suspende muestra "Recuperación"
notas = [8.5, 4.8, 9.2, 3.0, 7.5]
resultado = [str(n) if n >= 5 else "Recuperación" for n in notas]
print(resultado)
# ['8.5', 'Recuperación', '9.2', 'Recuperación', '7.5']
11. Otras secuencias iterables
Tuplas
coordenadas = [(0, 0), (1, 3), (4, 2), (7, 5)]
for x, y in coordenadas:
print(f"Punto: x={x}, y={y}")
reversed() — recorrer al revés
alumnos = ["Ana", "Carlos", "María", "Pedro"]
for alumno in reversed(alumnos):
print(alumno)
# Pedro
# María
# Carlos
# Ana
sorted() — recorrer ordenado
notas = [8.5, 4.8, 9.2, 3.0, 7.5]
for nota in sorted(notas):
print(nota, end=" ")
# 3.0 4.8 7.5 8.5 9.2
for nota in sorted(notas, reverse=True):
print(nota, end=" ")
# 9.2 8.5 7.5 4.8 3.0
set() — sin duplicados
ciudades = ["Madrid", "Barcelona", "Madrid", "Valencia", "Barcelona"]
for ciudad in set(ciudades):
print(ciudad)
# Sin duplicados (el orden no está garantizado)
12. Cuándo usar for y cuándo usar while
# FOR — cuando sabes sobre qué vas a iterar
notas = [8.5, 6.0, 9.2]
for nota in notas: # sabes que son exactamente estas notas
print(nota)
for i in range(10): # sabes que son exactamente 10 repeticiones
print(i)
# WHILE — cuando no sabes cuántas iteraciones necesitarás
while True:
nota = float(input("Nota: ")) # no sabes cuántas veces pedirá el usuario
if nota == -1:
break
contador = 0
while not encontrado: # no sabes cuándo encontrará el dato
buscar_dato()
contador += 1
Resumen de todas las formas
# 1. Lista básica
for elemento in lista:
# 2. Rango simple
for i in range(n):
# 3. Rango con inicio y fin
for i in range(inicio, fin):
# 4. Rango con paso
for i in range(inicio, fin, paso):
# 5. Rango hacia atrás
for i in range(fin, inicio, -1):
# 6. Con índice y valor
for i, valor in enumerate(lista):
# 7. Dos listas a la vez
for a, b in zip(lista1, lista2):
# 8. Claves de diccionario
for clave in diccionario:
# 9. Valores de diccionario
for valor in diccionario.values():
# 10. Clave y valor de diccionario
for clave, valor in diccionario.items():
# 11. String carácter a carácter
for letra in string:
# 12. Ordenado
for elemento in sorted(lista):
# 13. Al revés
for elemento in reversed(lista):
# 14. Comprensión de lista
nueva_lista = [expresion for elemento in lista if condicion]
# 15. Anidado
for exterior in lista_exterior:
for interior in lista_interior:
# 16. Con else
for elemento in lista:
if condicion:
break
else:
# se ejecuta si no hubo break
Ejercicios:
- Escribe un programa que recorra una lista de números y calcule la suma de todos los números en la lista.
- Crea un programa que recorra una cadena de caracteres y cuente cuántas veces aparece la letra «a» en la cadena.
- Desarrolla un programa que recorra un rango de números del 1 al 10 y muestre el cuadrado de cada número en una línea separada.