Generadores En Python

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


Hoy toca el turno de hablar sobre Generadores. Ver谩s, en Python un generador no es m谩s que un tipo especial de funci贸n, la cual retorna un objeto que podemos iterar. Una definici贸n bastante sencilla 驴no? Veamos un par de ejemplos.

def pares(): 
   return [2, 4, 6, 8, 10]

En primera instancia podemos pensar que la funci贸n pares corresponde a un generador, sin embargo esto no es as铆. Si bien es cierto la funci贸n cumple con la definici贸n de un generador, esta aun no puede ser catalogada como uno, ya que no retorna un lazy iterador (Iteraci贸n perezosa ). 馃惃

馃悕 A diferencia de una lista o una tupla, la informaci贸n de un lazy iterador no se almacenada en memoria.

Ahora, quiz谩s te estes preguntando 驴C贸mo podemos crear nuestros propios generadores? La respuesta la obtendremos al utilizar la palabra reservada yield.

Veamos otro ejemplo. Definamos 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 se reanudar谩 en el punto donde se detuvo.

Para nosotros hacer uso de un decorador podemos apoyarnos de un ciclo for.

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

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)

Ventaja

Una de las principales ventajas de utilizar un generador recaen en el uso de memoria. Como mencionamos anteriormente los generadores retorna un Lazy iterador, algo de mucha utilidad cuando debemos trabajar con una gran cantidad de datos y es necesario realizar operaciones sobre ellos.

Al utilizar generadores estaremos ahorrando espacio en memoria.


Listo, estas 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 $2 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. 馃悕

Comentarios

Para poder conocer tu opini贸n es necesario ser un usuario autenticado. Login