Generadores En Python

Fecha de publicaci贸n: 28 Junio 2020
Tiempo de lectura: 2 min.
Premium: False
N煤mero de visitas: 1529


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)

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. 馃殌

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. 馃悕