Saltar al contenido
Editor

Bucles for en Python: recorre cualquier cosa con ejemplos

Principiante25 min7 ejercicios95 XP

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

0/7 ejercicios

Imagina que eres profesor y tienes 30 estudiantes. Tienes que imprimir el boletín de calificaciones de cada uno. ¿Escribirías 30 instrucciones print por separado? Claro que no. Le dirías a la computadora: "para cada estudiante, imprime su boletín". Eso es exactamente lo que hace un bucle for.

En esta lección aprenderás a usar el bucle for de Python para repetir acciones sobre listas, cadenas de texto, rangos de números y diccionarios. También descubrirás herramientas muy útiles como enumerate() y zip(), que hacen los bucles todavía más sencillos.

Al terminar, podrás procesar colecciones de datos de forma eficiente en lugar de escribir código repetitivo. Es una de las habilidades más importantes de la programación.

¿Cómo funciona un bucle for en Python?

Un bucle for toma una colección de elementos y ejecuta el mismo código una vez por cada elemento. En cada vuelta del bucle, una variable guarda el elemento actual. A cada vuelta se le llama iteración.

Piénsalo como repartir cartas. Tomas la baraja y, por cada carta, la colocas boca arriba sobre la mesa. La carta cambia cada vez, pero la acción es siempre la misma.

Tu primer bucle for
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# Output:
# apple
# banana
# cherry
Salida
apple
banana
cherry

Esta es la estructura: la palabra clave for, un nombre de variable (fruit), la palabra clave in y la colección (fruits), seguidos de dos puntos. El código indentado que va debajo se ejecuta una vez por cada elemento de la lista.

En la primera iteración, fruit vale "apple". En la segunda, vale "banana". En la tercera, "cherry". Después del último elemento, el bucle termina y Python continúa con lo que venga después.

Acumular un total con un bucle for
# The loop variable can be anything you want
numbers = [10, 20, 30, 40]
total = 0
for num in numbers:
total = total + num
print(f"Added {num}, total is now {total}")
print(f"\nFinal total: {total}")
# Output:
# Added 10, total is now 10
# Added 20, total is now 30
# Added 30, total is now 60
# Added 40, total is now 100
#
# Final total: 100
Salida
Added 10, total is now 10
Added 20, total is now 30
Added 30, total is now 60
Added 40, total is now 100

Final total: 100

Este patrón, en el que empiezas con un valor y lo actualizas en cada iteración, se llama acumulación. Lo usarás constantemente: para sumar números, construir cadenas, reunir resultados y mucho más.


¿Qué hace range() en Python?

A veces no tienes una lista que recorrer: quieres repetir algo un número concreto de veces, o recorrer una secuencia de números. Para eso sirve range().

range() genera una secuencia de números. No crea una lista en memoria: produce los números uno a uno, a medida que el bucle los necesita. Por eso es eficiente incluso con rangos muy grandes.

range() con un argumento: stop
# range(5) gives you 0, 1, 2, 3, 4
for i in range(5):
print(i)
# Output:
# 0
# 1
# 2
# 3
# 4
Salida
0
1
2
3
4

Fíjate en que range(5) empieza en 0 y se detiene antes del 5. Te da exactamente 5 números: del 0 al 4. Este patrón de "empezar en cero y parar antes del final" se repite en todo Python.

range() con dos argumentos: start y stop
# range(start, stop) - starts at start, stops before stop
for i in range(1, 6):
print(i)
# Output:
# 1
# 2
# 3
# 4
# 5
Salida
1
2
3
4
5

Con dos argumentos, el primero indica dónde empezar y el segundo dónde parar (sin incluirlo). Así, range(1, 6) te da 1, 2, 3, 4, 5.

range() con tres argumentos: start, stop y step
# range(start, stop, step) - count by a custom step
print("Count by 2s:")
for i in range(0, 11, 2):
print(i, end=" ")
print() # newline
print("\nCountdown:")
for i in range(5, 0, -1):
print(i, end=" ")
print("\nBlastoff!")
# Output:
# Count by 2s:
# 0 2 4 6 8 10
#
# Countdown:
# 5 4 3 2 1
# Blastoff!
Salida
Count by 2s:
0 2 4 6 8 10 

Countdown:
5 4 3 2 1 
Blastoff!

El tercer argumento es el paso (step): cuánto se suma cada vez. Un paso de 2 se salta un número de cada dos. Un paso negativo cuenta hacia atrás. Puedes usar como paso cualquier número entero, positivo o negativo.


¿Cómo se recorren las cadenas y los diccionarios?

Los bucles for funcionan con cualquier cosa iterable en Python, no solo con listas y rangos. Las cadenas y los diccionarios son dos de los iterables que más vas a recorrer.

Recorrer una cadena

Cuando recorres una cadena, obtienes un carácter cada vez. Es útil para contar letras, revisar la ortografía o procesar texto carácter a carácter.

Recorrer una cadena
word = "Python"
for char in word:
print(char, end=" ")
# Output:
# P y t h o n
Salida
P y t h o n

Cada iteración te da el siguiente carácter. El end=" " de la función print cambia el salto de línea predeterminado por un espacio, así que todos los caracteres se imprimen en una sola línea.

Contar vocales con un bucle for
# Count vowels in a word
word = "programming"
vowel_count = 0
for char in word:
if char in "aeiou":
vowel_count += 1
print(f"\"{word}\" has {vowel_count} vowels")
# Output:
# "programming" has 3 vowels
Salida
"programming" has 3 vowels

Este ejemplo combina un bucle for con una instrucción if. Para cada carácter, comprobamos si es una vocal. Si lo es, aumentamos el contador. Es el tipo de patrón que escribirás todo el tiempo.

Recorrer un diccionario

Cuando recorres un diccionario, por defecto obtienes las claves. Para obtener las claves y los valores a la vez, usa el método .items().

Recorrer un diccionario
scores = {"Alice": 92, "Bob": 85, "Charlie": 78}
# Looping over keys (default)
print("Students:")
for name in scores:
print(f" {name}")
print()
# Looping over keys and values with .items()
print("Report card:")
for name, score in scores.items():
print(f" {name}: {score}")
# Output:
# Students:
# Alice
# Bob
# Charlie
#
# Report card:
# Alice: 92
# Bob: 85
# Charlie: 78
Salida
Students:
  Alice
  Bob
  Charlie

Report card:
  Alice: 92
  Bob: 85
  Charlie: 78

El método .items() devuelve cada entrada como un par (clave, valor). Al escribir for name, score in scores.items(), desempaquetas cada par en dos variables separadas. Es más limpio que acceder a scores[name] dentro del bucle.


¿Qué hace enumerate() en Python?

A veces necesitas el elemento Y TAMBIÉN su posición en la lista. Podrías usar range(len(list)) e indexar la lista a mano, pero Python tiene una forma más limpia: enumerate().

Sin enumerate() (engorroso)
colors = ["red", "green", "blue"]

for i in range(len(colors)):
    print(f"{i}: {colors[i]}")
Con enumerate() (limpio)
colors = ["red", "green", "blue"]

for i, color in enumerate(colors):
    print(f"{i}: {color}")

enumerate() envuelve un iterable y te da pares (índice, elemento). Desempaquetas cada par en dos variables. Los dos ejemplos producen la misma salida, pero la versión con enumerate() es más legible y más pythónica.

enumerate() con start=1 para listas numeradas
tasks = ["Buy groceries", "Clean house", "Walk dog", "Cook dinner"]
print("Today's to-do list:")
for i, task in enumerate(tasks, start=1):
print(f" {i}. {task}")
# Output:
# Today's to-do list:
# 1. Buy groceries
# 2. Clean house
# 3. Walk dog
# 4. Cook dinner
Salida
Today's to-do list:
  1. Buy groceries
  2. Clean house
  3. Walk dog
  4. Cook dinner

El argumento start=1 le indica a enumerate() que empiece a contar desde 1 en lugar de 0. Es perfecto para crear listas numeradas, donde un "elemento 0" no tendría sentido para quien las lee.


¿Cómo recorrer varias listas a la vez con zip()?

¿Y si tienes dos listas relacionadas y quieres procesarlas juntas? Por ejemplo, una lista con nombres de estudiantes y otra con sus calificaciones. zip() las empareja para que puedas recorrer las dos a la vez.

Recorrer dos listas con zip()
names = ["Alice", "Bob", "Charlie"]
scores = [92, 85, 78]
for name, score in zip(names, scores):
result = "Pass" if score >= 80 else "Needs improvement"
print(f"{name}: {score} ({result})")
# Output:
# Alice: 92 (Pass)
# Bob: 85 (Pass)
# Charlie: 78 (Needs improvement)
Salida
Alice: 92 (Pass)
Bob: 85 (Pass)
Charlie: 78 (Needs improvement)

zip() toma dos o más iterables y los combina elemento a elemento. En la primera iteración, obtienes el primer elemento de cada lista. En la segunda, el segundo de cada una, y así sucesivamente.

Combinar tres listas con zip()
# zip() works with more than two lists
first_names = ["Alice", "Bob", "Charlie"]
last_names = ["Smith", "Jones", "Brown"]
ages = [25, 30, 22]
for first, last, age in zip(first_names, last_names, ages):
print(f"{first} {last}, age {age}")
# Output:
# Alice Smith, age 25
# Bob Jones, age 30
# Charlie Brown, age 22
Salida
Alice Smith, age 25
Bob Jones, age 30
Charlie Brown, age 22

¿Qué son los bucles for anidados?

Puedes poner un bucle for dentro de otro bucle for. El bucle interior se ejecuta completo en cada iteración del bucle exterior. Esto se llama anidamiento, y es la forma de trabajar con cuadrículas, tablas y combinaciones.

Bucles anidados: tabla de multiplicar
# Multiplication table (1-3)
for row in range(1, 4):
for col in range(1, 4):
result = row * col
print(f"{row} x {col} = {result}")
print() # blank line between rows
# Output:
# 1 x 1 = 1
# 1 x 2 = 2
# 1 x 3 = 3
#
# 2 x 1 = 2
# 2 x 2 = 4
# 2 x 3 = 6
#
# 3 x 1 = 3
# 3 x 2 = 6
# 3 x 3 = 9
Salida
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6

3 x 1 = 3
3 x 2 = 6
3 x 3 = 9

Cuando row vale 1, el bucle interior se ejecuta con col tomando los valores 1, 2, 3. Luego row pasa a valer 2, y el bucle interior vuelve a ejecutarse con col tomando 1, 2, 3. El bucle interior empieza de cero cada vez que el exterior avanza.


Ejercicios de práctica

¡Es hora de poner en práctica lo que sabes de bucles for! Estos ejercicios van desde la iteración básica hasta combinar bucles con las herramientas que acabas de aprender.

Intenta resolver cada ejercicio por tu cuenta antes de mirar las pistas. Atascarte y encontrar la salida tú mismo es como se aprende de verdad.

Ejercicio 1: imprime la lista de compras
Escribe el código

Tienes una lista de productos del supermercado. Usa un bucle for para imprimir cada producto en su propia línea.

Salida esperada:

milk
eggs
bread
butter
groceries = ["milk", "eggs", "bread", "butter"]
# Use a for loop to print each item
Ejercicio 2: suma los números del 1 al 10
Escribe el código

Usa range() y un bucle for para calcular la suma de todos los números del 1 al 10 (ambos incluidos). Imprime el resultado.

Salida esperada:

Sum: 55
# Calculate the sum of numbers 1 through 10 using range()
total = 0
# Write your for loop here
print(f"Sum: {total}")
Ejercicio 3: predice la salida
Predice la salida

Sin ejecutar el código, predice exactamente lo que va a imprimir. Fíjate bien en los argumentos de range() y en la condición del if.

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

for num in range(1, 8, 2):
if num > 4:
print(f"{num} is big")
else:
print(f"{num} is small")
Ejercicio 4: corrige el error del contador de letras
Corrige el error

Este código debería contar cuántas veces aparece la letra "l" en "hello world", pero tiene errores. Corrígelo para que imprima:

The letter "l" appears 3 times

No cambies la variable word ni la instrucción print final: corrige solo la lógica del bucle.

word = "hello world"
count = 0
for char in word:
if char == "L":
count = 1
print(f'The letter "l" appears {count} times')
Ejercicio 5: menú numerado
Escribe el código

Usa enumerate() con start=1 para imprimir el menú numerado de un restaurante.

Salida esperada:

1. Burger - $8.99
2. Pizza - $12.50
3. Salad - $7.25
4. Pasta - $10.00
items = ["Burger", "Pizza", "Salad", "Pasta"]
prices = [8.99, 12.50, 7.25, 10.00]
# Use enumerate() and zip() to print the numbered menu
Ejercicio 6: invierte una cadena
Escribe el código

Usa un bucle for para invertir la cadena "Python" construyendo una cadena nueva carácter a carácter. NO uses el rebanado o slicing ([::-1]) ni la función reversed().

Salida esperada:

nohtyP
original = "Python"
reversed_str = ""
# Use a for loop to build the reversed string
print(reversed_str)
Ejercicio 7: informe de calificaciones
Escribe el código

Recorre el diccionario grades e imprime el nombre de cada estudiante y su calificación en letra. Una nota de 90 o más es "A", de 80 o más es "B", de 70 o más es "C", y por debajo de 70 es "F".

Salida esperada:

Alice: 95 (A)
Bob: 82 (B)
Charlie: 67 (F)
Diana: 73 (C)
grades = {"Alice": 95, "Bob": 82, "Charlie": 67, "Diana": 73}
# Loop over the dictionary and print each student's grade

Resumen: bucles for en Python

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

PatrónQué haceEjemplo
for x in listRecorre cada elementofor fruit in fruits:
for i in range(n)Repite n veces (de 0 a n-1)for i in range(5):
range(start, stop, step)Secuencia de números a medidarange(1, 11, 2)
for char in stringRecorre los caracteresfor c in "hello":
for k, v in dict.items()Recorre pares clave-valorfor name, score in grades.items():
enumerate(iterable)Da el índice y el elementofor i, x in enumerate(list):
zip(a, b)Empareja elementos de dos listasfor x, y in zip(names, scores):

Reglas clave para recordar:

  • La línea del for termina con dos puntos (:)
  • El cuerpo del bucle debe ir indentado
  • range() se detiene ANTES del número final
  • enumerate() es mejor que range(len(...))
  • zip() se detiene en la lista más corta
  • Usa nombres en singular para las variables del bucle (for student in students)
  • ¿Qué sigue?

    Los bucles for son ideales cuando sabes exactamente qué vas a recorrer. Pero ¿y si quieres seguir repitiendo hasta que cambie alguna condición? Para eso están los bucles while. En la siguiente lección, [Bucles while en Python](/python/python-while-loops), aprenderás a repetir según una condición en lugar de recorrer una colección.

    Tutoriales relacionados

    ¿Te sirvió este tutorial?

    Sugerir una mejora