Los ite­ra­do­res de Python son objetos Python con un conjunto contable de elementos que im­ple­me­n­tan el protocolo iterador formado por las funciones iter() y next().

¿Qué son exac­ta­me­n­te los iterators en Python?

Los iterators de Python son pri­n­ci­pa­l­me­n­te una forma especial de objetos de Python. Se ca­ra­c­te­ri­zan por ser un conjunto de elementos contables. Así, puedes contar los elementos de un iterador e iterar sobre todos los elementos de un iterator de Python.

Consejo

Python es un excelente lenguaje de pro­gra­ma­ción para proyectos web. Deploy Now te ayuda con la im­ple­me­n­ta­ción au­to­má­ti­ca y la co­n­s­tru­c­ción de tu proyecto a través de GitHub, para que siempre tengas una visión completa.

Iterators vs. Iterables

Los iterators en Python no deben co­n­fu­n­di­r­se con los Python iterables. Sin embargo, los iterators y los iterables están es­tre­cha­me­n­te re­la­cio­na­dos. Los distintos iterables como la lista Python se ca­ra­c­te­ri­zan por tener un método iter() y por tanto permiten iterar a través de ellos. Como regla general, todo lo que está a la derecha de la cabecera del bucle cuando abres un bucle for es un iterable.

l = [1, 2, 3]
for x in l:
	print(x)
Python

Como puedes ver, la lista al­ma­ce­na­da en la variable “l” aparece en la llamada al bucle for en Python a la derecha de la cabecera del bucle después de la palabra clave “in” y es por tanto un iterable.

Puedes derivar un iterator en Python de un iterable. Para aclarar esto y entender las di­fe­re­n­cias, un ejemplo de código puede ayudarte:

string = "test"
objetoiterador = iter(string)
next(objetoiterador)
iter(objetoiterador)
Python

Primero, en el código, una Python string con el valor “test” se almacena en la variable llamada “string”. Las cadenas también entran en la categoría de iterables, porque puedes iterar a través de cada letra de la cadena.

El hecho de que puedas iterar a través de cadenas bá­si­ca­me­n­te no significa otra cosa que una cadena también es co­m­pa­ti­ble con la función iter(). Puedes verlo en la siguiente línea de código, donde se crea un iterator en Python llamando a la función iter junto con la cadena creada pre­via­me­n­te. Esto devuelve un puntero a la cadena y lo almacena en la variable llamada “ob­je­toi­te­ra­dor”. Así, el iterator en Python se encuentra en un estado. Es posible cambiar este estado llamando al método next() en el iterator en Python. Este método mueve el punto un carácter para que “ob­je­toi­te­ra­dor” apunte a la primera letra de la cadena después de la llamada a la función.

La llamada a la función iter(), que toma el iterator en Python como parámetro, devuelve una re­fe­re­n­cia al mismo. Los ite­ra­do­res en Python son, por tanto, au­toi­te­ra­bles.

Iterators vs. Ge­ne­ra­to­rs

También es im­po­r­ta­n­te di­s­ti­n­guir los iterators de los Python ge­ne­ra­to­rs. Aunque todo Python generator es también un iterador, no sucede lo mismo a la inversa. A di­fe­re­n­cia de un generador, un iterador no se forma ne­ce­sa­ria­me­n­te con una función que contiene una expresión yield.

Consejo

Los Python iterators son un co­n­s­tru­c­to de pro­gra­ma­ción algo más avanzada que no cubren todos los tu­to­ria­les de Python. Si quieres aprender técnicas más avanzadas de Python, merece la pena que eches un vistazo a los si­guie­n­tes artículos:

¿Para qué se utilizan los iterators en Python y por qué?

El uso principal de los ite­ra­do­res es, por supuesto, la iteración misma. La gran ventaja de los iterators en Python es que funcionan según el principio de “Lazy Eva­lua­tion”. En otras palabras, esto significa que cada elemento de un iterator en Python puede ser procesado in­di­vi­dua­l­me­n­te sin tener que cargar en memoria la es­tru­c­tu­ra de datos en su totalidad. Este co­m­po­r­ta­mie­n­to es una ventaja de efi­cie­n­cia, es­pe­cia­l­me­n­te con grandes ca­n­ti­da­des de datos, donde solo es necesario cargar un elemento cada vez.

Cómo crear iterators en Python

Crear tu propio iterator en Python no es difícil. Todo lo que tienes que hacer es añadir las funciones iter() y next() a un objeto Python. De esta forma puedes crear fá­ci­l­me­n­te un iterador que devuelva todos los números pares. Este ejemplo de código muestra cómo funciona exac­ta­me­n­te:

class numerospares:
	def __iter__(self):
		self.x = 0
		return self
	def __next__(self):
		a = self.x
		self.x += 2
		return a
objetoprueba = numerospares()
iteradorprueba = iter(objetoprueba)
print(next(iteradorprueba))
print(next(iteradorprueba))
print(next(iteradorprueba))
print(next(iteradorprueba))
Python

Para crear un iterator en Python, primero se crea una clase, que aquí tiene el nombre “nu­me­ro­s­pa­res”. Dentro de la clase, las dos funciones iter() y next() se im­ple­me­n­tan cada una con el co­m­po­r­ta­mie­n­to deseado.

En nuestro caso, la función iter() si­m­ple­me­n­te devuelve una re­fe­re­n­cia al iterador que se supone que aloja la secuencia de enteros empezando por 0. La lógica de la iteración, es decir, que solo salga cada segundo y, por tanto, cada número par, está dentro de la función next().

Una vez definida la clase, se crea un objeto de la misma y se almacena en la variable llamada “ob­je­to­prue­ba”. El objeto se convierte en un iterator en Python llamando a la función iter(), como ya se ha mostrado en el ejemplo de código anterior. A co­n­ti­nua­ción, se realizan cuatro llamadas a next(), cuyos re­su­l­ta­dos se muestran en pantalla. El resultado del bloque de código anterior sería el siguiente:

0
2
4
6

Limitar los iterators en Python

El iterador que itera sobre los números pares se eje­cu­ta­ría hasta el infinito sin un límite al igual que el conjunto de números pares. Esto puede evitarse mediante una sentencia “Sto­pI­te­ra­tion” junto con una sentencia if else de Python Por ejemplo, si deseas obtener todos los números pares hasta 100 inclusive en tu iterator en Python, debes adaptar el ejemplo de código anterior de la siguiente manera:

class numerospares:
	def __iter__(self):
		self.x = 0
		return self
	def __next__(self):
		if self.x <= 100:
			a = self.x
			self.x += 2
			return a	
		else:
			StopIteration
objetoprueba = numerospares()
iteradorprueba = iter(objetoprueba)
print(next(objetoprueba))
print(next(objetoprueba))
print(next(objetoprueba))
print(next(objetoprueba))
Python

Nada ha cambiado en el código excepto la im­ple­me­n­ta­ción de la función next(). Se ha añadido una sentencia if else adicional que comprueba si el número actual es menor o igual que 100 e itera a través del conjunto de números pares solo bajo esta condición. Si el número supera el valor 100, se producirá un error a través de la llamada a Sto­pI­te­ra­tion.

Ir al menú principal