Pregunta 1¿Qué imprime este código?for i in range(2, 6):
print(i)
Bucles for con range / enumerate / zip
Aprende los bucles for de Python con range, enumerate y zip, y controla el flujo con break y continue.
Hasta ahora hemos aprendido la ramificación con if / elif y las comprobaciones masivas con all() / any().
En este artículo aprenderás la instrucción for para ejecutar el mismo trabajo sobre cada elemento de una lista. Con if y for en tu caja de herramientas, puedes escribir la mayor parte del código práctico del día a día.
Sacar un elemento a la vez con for
Una instrucción for toma un objeto repetible (un iterable) como una lista, tupla, cadena (string) o dict, y saca los elementos uno por uno desde el principio, asignando cada uno a la variable que nombres y ejecutando tu bloque cada vez.
La forma básica es una línea de for variable in iterable: más un bloque indentado con 4 espacios.
Saca un elemento de la colección → asígnalo a la variable → ejecuta el bloque → al siguiente, repitiendo hasta que se acaben los elementos.
# Iterar sobre una lista
fruits = ["manzana", "plátano", "naranja"]
for fruit in fruits:
print(fruit)
# Salida:
# manzana
# plátano
# naranja
# Las cadenas también son iterables (un carácter a la vez)
for ch in "ABC":
print(ch)
# Imprime A / B / C en orden
No olvides los dos puntos y la indentación de 4 espacios
La línea de for debe terminar con : (dos puntos), y cada línea del bloque debe estar indentada con 4 espacios (o un tabulador). Una indentación inconsistente lanza IndentationError.
Iterar un dict con for
Si pasas un dict directamente a for, solo se sacan las claves en orden. Para obtener también los valores, lo habitual es .items(). Si solo necesitas los valores, usa .values().
| Forma | Lo que obtienes | Uso típico |
|---|---|---|
| for key in d: | claves | Cuando basta con la clave |
| for value in d.values(): | valores | Cuando solo necesitas los valores para agregar |
| for key, value in d.items(): | pares clave/valor | Cuando necesitas ambos — para mostrar con formato o filtrar |
user = {"name": "ana", "age": 29, "role": "admin"}
# Solo claves
for key in user:
print(key)
# name / age / role
# Solo valores
for value in user.values():
print(value)
# ana / 29 / admin
# Claves y valores juntos
for key, value in user.items():
print(f"{key}: {value}")
# name: ana / age: 29 / role: admin
Repetir un número fijo de veces con range()
range(n) es una función integrada que devuelve la secuencia entera de 0 a n-1, y combinada con for es la forma estándar de escribir bucles de cuenta fija. Hay 3 formas comunes de llamarla.
| Forma | Valores generados | Uso |
|---|---|---|
| range(5) | 0, 1, 2, 3, 4 | 0 a n-1 |
| range(2, 8) | 2, 3, 4, 5, 6, 7 | Especifica inicio y fin (el fin es exclusivo) |
| range(1, 10, 2) | 1, 3, 5, 7, 9 | Especifica inicio, fin y paso |
# Iterar de 0 a 4
for i in range(5):
print(i)
# Imprime 0 1 2 3 4 (5 líneas)
# 2 a 7
for i in range(2, 8):
print(i)
# 1 a 9 en pasos de 2
for i in range(1, 10, 2):
print(i)
# Usa _ cuando solo necesitas el conteo, no el valor
for _ in range(3):
print("reintentando...")
Nombrar la variable del bucle como _ (un guion bajo) es una convención para señalar de inmediato «esta variable no se usa dentro». i o j también funcionarían, pero leer código donde no se usan hace que el lector se detenga y pregunte por qué — así que usa _ cuando solo te importe el conteo.
enumerate y zip para índices y listas paralelas
En código del mundo real, a menudo quieres la posición de cada elemento también, o quieres iterar sobre varias listas en paralelo. enumerate() y zip() lo hacen mucho más corto y legible.
enumerate() — iterar con un índice
Envolver una lista en enumerate(lista) te da pares (índice, elemento) en orden. Es útil para mostrar rankings o números de línea en mensajes de error — en cualquier sitio donde quieras adjuntar «cuál» a cada valor.
products = ["manzana", "pan", "leche"]
for index, name in enumerate(products):
print(f"{index}: {name}")
# 0: manzana
# 1: pan
# 2: leche
# Para empezar en 1, pasa el inicio como segundo argumento
for rank, name in enumerate(products, 1):
print(f"#{rank}: {name}")
# #1: manzana / #2: pan / #3: leche
zip() — iterar varias listas en paralelo
zip(lista1, lista2, ...) te permite sacar elementos del mismo índice juntos desde varias listas. Se detiene cuando la lista más corta se agota, así que es seguro incluso con longitudes distintas.
names = ["Ana", "Carlos", "Lucía"]
scores = [82, 91, 65]
for name, score in zip(names, scores):
print(f"{name}: {score} pts")
# Ana: 82 pts / Carlos: 91 pts / Lucía: 65 pts
Controlar bucles con break y continue
Es habitual querer detenerse porque has encontrado lo que necesitabas o saltarte solo esta iteración. Lo primero usa break para salir del bucle inmediatamente; lo segundo usa continue para saltar el resto de esta iteración y pasar al siguiente elemento.
break finaliza el propio bucle, así que los elementos restantes no se evalúan en absoluto. continue solo salta el resto de esta iteración y pasa al siguiente elemento — el bucle como tal continúa. Ambos se llaman típicamente desde dentro de un if.
# break: detenerse en cuanto encontremos el objetivo
users = ["ana", "carlos", "lucia", "diego"]
for name in users:
if name == "lucia":
print("Encontrada")
break
print(f"comprobando: {name}")
# comprobando: ana / comprobando: carlos / Encontrada
# continue: saltar los 0 al sumar
scores = [80, 0, 65, 0, 91]
total = 0
for score in scores:
if score == 0:
continue
total += score
print(total) # 80 + 65 + 91 = 236
En este artículo cubrimos el panorama general de for: iterar sobre listas y dicts, contar con range(), extender con enumerate() / zip() y controlar el flujo con break / continue.
En el siguiente artículo veremos el bucle while — usado para repetir cuando no conoces el conteo de antemano — y cómo evitar bucles infinitos.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2Cuando expandes enumerate(['a', 'b', 'c'], 1) con for, ¿qué pares se producen?
Pregunta 3¿Qué imprime este código?nums = [1, 2, 3, 4, 5]
for n in nums:
if n == 3:
continue
print(n)