Trabajar con grandes volúmenes de datos exige estrategias que cuiden la memoria. En Python, los iteradores y generadores permiten recorrer colecciones elemento por elemento, sin cargar todo el conjunto de datos al mismo tiempo. Comprender estas herramientas marca la diferencia entre un código funcional y uno verdaderamente eficiente.
¿Cómo funciona un iterador en Python?
Un iterador es un objeto que recorre los elementos de una colección sin usar índices. Se crea con la función iter() y se avanza con next() [00:18].
python
Crear una lista
lista = [1, 2, 3, 4]
Obtener el iterador
iterador = iter(lista)
Usar el iterador
print(next(iterador)) # 1
print(next(iterador)) # 2
print(next(iterador)) # 3
print(next(iterador)) # 4
Cada llamada a next() devuelve el siguiente valor almacenado en el iterador. Cuando se agotan los elementos y se intenta obtener uno más, Python lanza una excepción StopIteration [01:20]. Esto significa que, una vez consumido, el iterador no puede rebobinarse: no hay forma de volver atrás.
¿Se puede iterar sobre cadenas de texto?
Las cadenas también son iterables. Basta con pasar la variable de texto a iter() y luego recorrerla con un for [01:42].
python
texto = "hola mundo"
iterador = iter(texto)
for caracter in iterador:
print(caracter)
El resultado imprime cada carácter por separado: h, o, l, a, espacio, m, u, n, d, o. Esta técnica es útil cuando necesitas procesar texto carácter por carácter.
¿Cómo generar números impares con range e iteradores?
La función range() acepta tres argumentos: inicio, fin y paso [02:22]. Combinándola con iter() se obtiene un iterador que produce solo los valores deseados.
python
limite = 10
iterador = iter(range(1, limite + 1, 2))
for numero in iterador:
print(numero)
Salida: 1, 3, 5, 7, 9
- El inicio es
1 porque el primer número impar es uno.
- El fin es
limite + 1 para que el rango incluya el propio límite.
- El paso es
2, lo que hace que salte de dos en dos.
Si cambias el inicio a 0, obtienes los números pares: 0, 2, 4, 6, 8, 10 [03:10].
¿Qué es un generador y en qué se diferencia de un iterador?
Un generador es una función que produce una secuencia de valores usando la palabra reservada yield en lugar de return [03:30]. Cada vez que el flujo llega a yield, la función pausa su ejecución, entrega el valor y recuerda su estado para continuar después.
python
def mi_generador():
yield 1
yield 2
yield 3
for valor in mi_generador():
print(valor)
Salida: 1, 2, 3
La diferencia principal es que el generador crea los valores sobre la marcha, mientras que un iterador convencional necesita que la colección ya exista en memoria.
¿Cómo implementar la serie de Fibonacci con un generador?
La serie de Fibonacci se construye sumando los dos valores anteriores para obtener el siguiente: 0, 1, 1, 2, 3, 5, 8, 13… [04:08]. Un generador es ideal porque produce cada número solo cuando se solicita.
python
def fibonacci(limite):
a, b = 0, 1
while a < limite:
yield a
a, b = b, a + b
for numero in fibonacci(10):
print(numero)
Salida: 0, 1, 1, 2, 3, 5, 8
- Las variables
a y b se inicializan en 0 y 1 mediante asignación múltiple en una sola línea.
- El bucle
while a < limite controla hasta dónde crece la sucesión.
- En cada iteración,
yield a devuelve el valor actual y luego a, b = b, a + b actualiza ambas variables simultáneamente.
Con un límite de 10, la serie se detiene en 8 porque el siguiente valor sería 13, que supera el límite [05:15].
¿Cuándo elegir un iterador o un generador?
- Usa iteradores cuando ya tienes una colección y quieres recorrerla sin índices.
- Usa generadores cuando necesitas producir valores bajo demanda, especialmente en secuencias largas o infinitas donde almacenar todo en memoria sería inviable.
Ambas herramientas comparten el protocolo de iteración de Python, por lo que se integran de forma natural con bucles for y otras estructuras del lenguaje.
Ahora es tu turno: crea generadores que devuelvan los números pares e impares y comparte tu solución en los comentarios.