Generadores en python



@eduardo_gpg

Número de visitas 2450

Tiempo de lectura 2 min

28 Junio 2020

Hoy toca el turno de hablar sobre Generadores. Verás, en términos simples un generador no es más que un tipo especial de función, la cual retorna objetos que fácilmente podemos iterar, esto sin que la función finalice.

Una definición bastante sencilla ¿no? Veamos un par de ejemplos.

Comencemos creando un generador que nos permita iterar sobre todos los números pares del 1 al 100. La función pudiera quedar de la siguiente manera.

def pares():
    for x in range(0, 102, 2):
        yield x

Para este ejemplo no estamos utilizando la palabra reservada return, si no yield. A diferencia de return, donde retornaremos un objeto y finalizaremos la función, con la palabra reservada yield suspenderemos, de forma momentánea, la ejecución de la función; esto para retornar un objeto. Una vez el objeto haya sido retornado la función podrá reaundarsé en el punto donde se detuvo.

🐍 A diferencia de retornar un lista o una tupla, al utilizar yield estaremos trabajando con un lazy iterador o iteración perezosa. Pudiendo obtener cada uno de los objetos que el generador genera y retorna on demand (bajo demanda), siempre que lo necesitemos.

La principal ventaja de esto recae en el uso de memoria, ya que al nosotros solo obtener los valores que necesitemos cuando lo necesitemos, no estaremos reservando espacio en memoria que no usaremos. Esto nos viene perfecto al trabajar con colecciones de miles, cientos de miles o inclusive millos de registros. Pudiendo así tener programar con un mucho mayor performance. Reservando espacio en memoria que si usaremos.

Ahora utilicemos nuestro generador.

if __name__ == '__main__':
    print('Listado de todos los números pares del 1 al 100)

    for par in pares():
        print(par)

Si ejecutamos el programa, obtendremos como resultado todos los números pares del 1 al 100.

$ python main.py
0
2
4
6
...

Si en dado caso no queremos utilizar un ciclo for, podemos obtener los valores del generador mediante la función next.

>>> numeros = pares()
>>> numeros
<generator object pares at 0x10ce5b660>

>>> next(numeros)
0
>>> next(numeros)
2
>>> next(numeros)
4

Obtenemos los elementos on demand. Con forme vayamos necesitandolos.

Es importante mencionar que, una vez hayamos obtenido todos los elementos del generador e intentemos nuevamente utilizar la función next, obtendremos el error: StopIteration. Para evitar que le programa termine de forma abrupta, una excelente idea sería utilizar un try y un except.

if __name__ == '__main__':
    numeros = pares()

    while True:
        try:
            par = next(numeros)
            print(par)
        except StopIteration:
            print('Sin más valores en el generador')
            break

Otra forma de crear una generador es mediante el uso de una expresión.

>>> generador = ( number for number in range(0, 102, 2))
>>> generador
<generator object <genexpr> at 0x10ff78138>

No, no es un tuple comprehension (Eso no existe), es una generador.

Lo interesante de utilizar expresiones es la facilidad con la cual podemos encadenarlas.

# Generador 1
numeros = ( numero for numero in range(0, 100))

# Generador 2
pares = ( numero for numero in numeros if numero % 2 == 0 )

print('Listado de números pares')
for par in pares:
    print(par)
<hr />

Listo, esta serían las formas más sencillas de poder crear nuestros propios generadores. Si el tema te interesa me gustaría compartirte un par de ejercicios que pueden serte de utilidad.

De igual forma me gustaría mencionar que tenemos un segundo post donde abordamos el tema de generadores de forma mucho más avanzada. Te invito a que le eches un vistazo. 🚀


¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍