logo cosasdedevs
¿Qué es un iterador en Python?

¿Qué es un iterador en Python?



My Profile
Sep 01, 2021

¡Hola! Espero que estéis bien y hayáis podido disfrutar de las vacas si ya las habéis tenido 😄, yo empiezo hoy 😅. Empezamos septiembre con fuerza y en el tutorial de hoy vamos a ver qué son los iteradores en Python y como implementarlos en nuestros proyectos 🤘.

¿Qué son los iteradores en Python?

Un iterador en Python es una función por la cual podremos realizar una acción un número determinado de veces hasta que se cumpla una condición o incluso de manera infinita.

En este blog, ya hemos visto algunos ejemplos de iteradores como por ejemplo son las secuencias creadas con range.

Cómo crear un iterador en Python

Crear un iterador es muy sencillo. Si por ejemplo lo queremos hacer sobre una lista de 4 números, instanciamos un objeto de tipo iter() que recibirá por parámetro la lista. 

Para recorrerlo utilizaremos next(). Esta función recibe por parámetro nuestro iterador y cada vez que se ejecuta, incrementa el número de la posición en la que la iteración se encuentra. Por ejemplo, si es la primera vez que se ejecuta, estará en la posición inicial, la segunda vez se habrá incrementado en 1 y así sucesivamente hasta llegar al final de la iteración:

num = iter([1, 2, 3, 4])
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))

Si ejecutáis el código, veréis que al llegar al quinto print se lanza la excepción StopIteration. Esto sucede porque en la anterior iteración llegamos al final de la lista, por lo tanto lanzará una excepción, ya que no hay más valores sobre los que iterar.

Otra forma de iterar sobre un iterador es utilizando el ciclo for, además de esta forma podremos evitar la excepción StopIteration:

num = iter([1, 2, 3, 4])
for n in num:
    print(n)

Una traducción a un código más legible de lo que está haciendo la clase iter sería esta:

class MyIter:
    def __init__(self, my_list):
        self.limit = len(my_list)
        self.my_list = my_list
        self.position = 0

    def next(self):

        if self.position < self.limit:
            position = self.position
            self.position += 1
            return self.my_list[position]
        else:
            raise StopIteration

num = MyIter([1, 2, 3, 4])
print(num.next())
print(num.next())
print(num.next())
print(num.next())

La clase MyIter recibe la lista en el constructor. En él, obtenemos el tamaño de la lista y guardamos la lista en una variable de clase para poder acceder a ella más adelante. También definimos la posición inicial que en una lista siempre será 0.

El método next se encargará de recorrer la lista. Cada vez que se ejecute, comprobará si hemos llegado al límite y si no es así, guardará la posición actual en una variable, después la incrementará en la variable de clase y por último accederemos al valor de la lista pasando la posición y lo retornaremos. Si hemos llegado al final, lanzará la excepción StopIteration.

Cómo crear un iterador customizado en Python

Para crear un iterador custom, debemos crear una clase que como mínimo contenga la función mágica __iter__. Si queremos modificar el comportamiento al iterar sobre nuestro iterador, debemos modificar la función mágica __next__.

Para verlo más claro, vamos a crear una clase que tendrá un comportamiento similar a las secuencias range en la que podremos dar un número de inicio, un número de fin y el incremento que queremos que se realice en cada iteración. Para ello os dejo un ejemplo de como lo podríamos hacer con un iterador:

class RangeNumber:

    def __init__(self, init=0, limit=None, increment=1):
        self.current_number = init
        self.limit = limit
        self.increment = increment

    def __iter__(self):
        return self

    def __next__(self):

        if self.limit is not None and self.current_number <= self.limit:
            current = self.current_number
            self.current_number += self.increment
            return current
        else:
            raise StopIteration


for num in RangeNumber(0, 10, 2):
    print(num)

En este ejemplo, creamos una clase llamada RangeNumber, la cual al ser instanciada recibe el número de inicio, el número máximo y el incremento por iteración.

Después declaramos la función mágica __iter__ la cual le dice a Python que esta clase es un iterador.

Por último, creamos la función mágica __next__ la cual comprueba si ya hemos sobrepasado el límite. Si es así lanza la excepción StopIteration, si no, guarda el número actual en una variable, después lo incrementa para que en la siguiente iteración dispongamos del siguiente número del rango y por último retorna la variable en la que guardamos el número actual.

Y bueno, eso es todo por este tutorial. Espero que os haya gustado y como siempre, os recomiendo seguirme en Twitter para estar al tanto de los nuevos tutoriales y suscribiros a mi canal de YouTube en el que vamos a extender todos los aprendizajes de este blog.

Nos leemos 👋.

🐍 Sígueme en Twitter

Si te gusta el contenido que subo y no quieres perderte nada, sígueme en Twitter y te avisaré cada vez que cree contenido nuevo 💪
Luego ¡Te sigo!

Nos tomamos en serio tu privacidad

Utilizamos cookies propias y de terceros para mejorar la experiencia del usuario a través de su navegación. Si pulsas entendido aceptas su uso. Ver política de cookies.