CAP 03 · LEC 04·Control de flujo

for, range y enumerate: iterar colecciones con elegancia

El for de Python es idiomático: itera directamente sobre colecciones sin índices. range() y enumerate() cubren los casos donde sí necesitas el número.

● PRINCIPIANTE8 min lectura5 ejerciciospor Fernando Herrera · actualizado mayo de 2026
¿Encontraste un error o algo que mejorar?Editá esta lección en GitHub →

for sobre listas, strings y dicts

El for de Python itera directamente sobre cualquier iterable — no necesitas índices ni gestionar el tamaño de la colección:

# Iterar una lista frutas = ["manzana", "pera", "uva", "mango"] for fruta in frutas: print(fruta) # Iterar un string — cada carácter for letra in "Python": print(letra, end=" ") print() # salto de línea # Iterar un diccionario — por defecto itera las claves persona = {"nombre": "Ana", "edad": 28, "ciudad": "Madrid"} for clave in persona: print(f"{clave}: {persona[clave]}") # Iterar valores for valor in persona.values(): print(valor) # Iterar pares clave-valor (lo más común) for clave, valor in persona.items(): print(f"{clave}{valor}")
Salidamanzana pera uva mango P y t h o n nombre: Ana edad: 28 ciudad: Madrid Ana 28 Madrid nombre → Ana edad → 28 ciudad → Madrid
for sobre cualquier iterable

for funciona con listas, tuplas, strings, dicts, sets, generadores, archivos y cualquier objeto que implemente el protocolo iterable. Si puedes iterarlo en Python, puedes usarlo en un for.

range(start, stop, step)

range() genera una secuencia de números enteros. Es la forma idiomática de iterar un número fijo de veces:

# range(stop) — desde 0 hasta stop-1 for i in range(5): print(i, end=" ") # 0 1 2 3 4 print() # range(start, stop) — desde start hasta stop-1 for i in range(1, 6): print(i, end=" ") # 1 2 3 4 5 print() # range(start, stop, step) — con paso for i in range(0, 11, 2): print(i, end=" ") # 0 2 4 6 8 10 print() # range con paso negativo (cuenta hacia atrás) for i in range(10, 0, -1): print(i, end=" ") # 10 9 8 7 6 5 4 3 2 1 print() # range es lazy — no crea una lista en memoria r = range(1_000_000) print(type(r)) # <class 'range'> print(r[999_999]) # 999999 — acceso O(1) # Suma del 1 al 100 (fórmula de Gauss) total = sum(range(1, 101)) print(f"Suma 1..100 = {total}") # 5050
Salida0 1 2 3 4 1 2 3 4 5 0 2 4 6 8 10 10 9 8 7 6 5 4 3 2 1 <class 'range'> 999999 Suma 1..100 = 5050

enumerate() con índice

Cuando necesitas tanto el índice como el valor, enumerate() es la solución idiomática:

colores = ["rojo", "verde", "azul", "amarillo"] # ❌ Forma no idiomática (estilo C/Java) for i in range(len(colores)): print(f"{i}: {colores[i]}") # ✅ Forma idiomática con enumerate for i, color in enumerate(colores): print(f"{i}: {color}") # enumerate con inicio distinto a 0 print("--- Empezando desde 1 ---") for num, color in enumerate(colores, start=1): print(f"{num}. {color}")
Salida0: rojo 1: verde 2: azul 3: amarillo 0: rojo 1: verde 2: azul 3: amarillo --- Empezando desde 1 --- 1. rojo 2. verde 3. azul 4. amarillo

zip() para iterar en paralelo

zip() permite iterar dos o más colecciones en paralelo, emparejando los elementos por posición:

nombres = ["Ana", "Carlos", "Beatriz"] puntos = [850, 1200, 750] ciudades = ["Madrid", "Barcelona", "Sevilla"] # Iterar dos listas en paralelo for nombre, puntaje in zip(nombres, puntos): print(f"{nombre}: {puntaje} puntos") # Iterar tres listas en paralelo for nombre, puntaje, ciudad in zip(nombres, puntos, ciudades): print(f"{nombre} ({ciudad}): {puntaje}") # zip se detiene en la colección más corta numeros = [1, 2, 3, 4, 5] letras = ["a", "b", "c"] for n, l in zip(numeros, letras): print(n, l) # solo 3 pares # zip con itertools.zip_longest para incluir todos from itertools import zip_longest for n, l in zip_longest(numeros, letras, fillvalue="?"): print(n, l) # 5 pares, rellenando con "?"
SalidaAna: 850 puntos Carlos: 1200 puntos Beatriz: 750 puntos Ana (Madrid): 850 Carlos (Barcelona): 1200 Beatriz (Sevilla): 750 1 a 2 b 3 c 1 a 2 b 3 c 4 ? 5 ?

Practica

Cinco ejercicios para dominar la iteración idiomática en Python.