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.
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}")
manzana
pera
uva
mango
P y t h o n
nombre: Ana
edad: 28
ciudad: Madrid
Ana
28
Madrid
nombre → Ana
edad → 28
ciudad → Madridfor 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
0 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 = 5050enumerate() 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}")
0: 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. amarillozip() 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 "?"
Ana: 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.