Iteradores en Python
Este artículo explica los iteradores en Python.
YouTube Video
Iteradores en Python
Resumen
En Python, un iterador es un mecanismo fundamental para procesar los elementos de colecciones como listas, tuplas y diccionarios uno por uno.
¿Qué es un iterador?
Un iterador es un objeto que puede devolver elementos uno a la vez. En Python, un objeto se considera un iterador si cumple las siguientes dos condiciones:.
- Tiene un método
__iter__()
que devuelve a sí mismo. - Tiene un método
__next__()
que devuelve el siguiente elemento. Lanza una excepciónStopIteration
cuando no hay más elementos.
1iterator = iter([1, 2, 3])
2print(next(iterator)) # 1
3print(next(iterator)) # 2
4print(next(iterator)) # 3
5# print(next(iterator)) # StopIteration occurs
- En este código, la función
iter()
se utiliza para convertir una lista en un iterador, y la funciónnext()
se usa para obtener y mostrar cada elemento uno por uno.
Diferencia con Iterable
Un iterable es un objeto que implementa el método __iter__()
y puede ser utilizado en un bucle for
. Las listas y las tuplas son ejemplos de iterables.
1nums = [10, 20, 30]
2it = iter(nums) # Get an iterator from the iterable
3print(next(it)) # 10
- Este código es un ejemplo de cómo obtener un iterador de un iterable como una lista y recuperar los elementos en orden usando
next()
.
Cómo comprobarlo:
1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable)) # True
7print(isinstance(nums, Iterator)) # False
8print(isinstance(it, Iterator)) # True
- Este código confirma que
nums
es un iterable pero no un iterador, mientras queit
, obtenido usandoiter(nums)
, es un iterador.
Relación entre los bucles for y los iteradores
Un bucle for
en Python funciona internamente de la siguiente manera:.
1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4 try:
5 value = next(iterator)
6 print(value)
7 except StopIteration:
8 break
- Como se muestra, el bucle
for
usa implícitamente un iterador para realizar la iteración.
Creando un iterador personalizado
Puedes crear un iterador personalizado utilizando una clase.
1class Countdown:
2 def __init__(self, start):
3 self.current = start
4
5 def __iter__(self):
6 return self
7
8 def __next__(self):
9 if self.current <= 0:
10 raise StopIteration
11 value = self.current
12 self.current -= 1
13 return value
14
15for num in Countdown(3):
16 print(num) # 3, 2, 1
- Este código define un iterador personalizado que cuenta hacia atrás usando la clase
Countdown
y muestra los números del 3 al 1 utilizando un buclefor
.
Diferencia entre iteradores y generadores, y cuándo usar cada uno
Los generadores proporcionan una funcionalidad similar a la de los iteradores. Permiten definir iteradores de manera más concisa.
1def countdown(n):
2 while n > 0:
3 yield n
4 n -= 1
5
6for i in countdown(3):
7 print(i) # 3, 2, 1
- Este código define una función generadora que cuenta hacia atrás usando
yield
y muestra los números del 3 al 1 utilizando un buclefor
.
Diferencias entre iteradores (clase) y generadores (función)
Existen las siguientes diferencias entre los iteradores (clases) y los generadores (funciones):.
Característica | Iterador (clase) | Generador (función) |
---|---|---|
Definición | __iter__() + __next__() |
Función usando yield |
Gestión de estado | Requiere manejo manual de atributos | Mantiene automáticamente el estado |
Legibilidad | Puede volverse complejo | Simple y claro |
-
Diferencia en cómo se definen Un iterador se define escribiendo manualmente dos métodos:
__iter__()
y__next__()
. En cambio, un generador es simplemente una función que utiliza la palabra claveyield
, lo que hace que el código sea mucho más simple. -
Diferencia en la gestión de estado Con un iterador, debes gestionar el estado actual y el avance manualmente utilizando variables. Los generadores, sin embargo, mantienen su estado internamente de forma automática en Python, reduciendo el esfuerzo manual.
-
Legibilidad del código Los iteradores tienden a volverse complejos porque requieren varios métodos y gestión manual del estado. En cambio, los generadores utilizan una sintaxis simple, lo que los hace más fáciles de entender incluso para los principiantes.
Biblioteca estándar para usar iteradores: itertools
itertools
, una biblioteca estándar de Python, proporciona herramientas potentes para trabajar con iteradores.
1import itertools
2
3for x in itertools.count(10, 2): # 10, 12, 14, ...
4 if x > 20:
5 break
6 print(x)
- También incluye muchas otras funciones como
cycle
,repeat
,chain
,islice
, ytee
.
Casos de uso de los iteradores
Los casos de uso para los iteradores incluyen los siguientes:.
- Procesamiento de líneas de archivos: Leer líneas una por una de un archivo como un iterador.
- Procesamiento eficiente en memoria: Procesar grandes cantidades de datos secuencialmente.
- Representar secuencias infinitas: Usar funciones como
itertools.count()
.
Resumen
- Un iterador es un objeto que puede recuperar el siguiente valor de forma secuencial.
- Puedes crear un iterador personalizado definiendo
__iter__()
y__next__()
. - Son gestionados automáticamente mediante bucles
for
o la funciónnext()
. - Utilizar generadores o
itertools
permite un procesamiento más eficiente.
Mediante el uso de iteradores, puedes procesar grandes volúmenes de datos de forma secuencial y eficiente en memoria, permitiendo una gestión controlada del estado y una mejora en el rendimiento del programa.
Puedes seguir el artículo anterior utilizando Visual Studio Code en nuestro canal de YouTube. Por favor, también revisa nuestro canal de YouTube.