En Python, ¿qué es un 'Generador' y cómo se diferencia de una función normal?

Entendiendo los Generadores en Python

Un generador en Python se diferencia de una función normal en que no devuelve un solo valor, sino que se puede iterar para producir una serie de resultados. Es decir, no devuelve todos los valores a la vez, como lo haría una lista, sino que produce un valor a la vez, lo cual es más eficiente en terminos de memoria.

En lugar de usar la palabra clave return, los generadores utilizan la palabra clave yield. Cada vez que se llama a yield, el generador produce el siguiente valor en su secuencia, y se suspende, lo que le permite mantener el estado entre llamadas.

He aquí un ejemplo simple de un generador de Python:

def generador_simple():
    yield 1
    yield 2
    yield 3

for num in generador_simple():
    print(num)

Al ejecutar este código, la salida constará de tres números en tres líneas diferentes:

1
2
3

En la primera vez que num toma el valor de generador_simple(), se ejecuta el código hasta que se encuentra el primer yield, que devuelve un 1 y suspende la función. En la próxima iteración se reanuda la ejecución de la función, hasta el segundo yield que devuelve un 2, y así sucesivamente.

Los generadores son particularmente útiles cuando se trabajan con grandes conjuntos de datos que serían demasiado costosos en términos de recursos para cargar en la memoria a la vez. Entonces, en lugar de cargar todos los datos, puedes generar y procesar un elemento a la vez, lo que puede llevar a un código más eficiente.

Es importante notar que una vez que un generador ha sido completamente iterado, ya no es útil. Si necesitas generar el mismo conjunto de valores varias veces, es mejor escribir una función que devuelva un nuevo generador cada vez que se necesite.

Los generadores son una característica poderosa de Python, que permiten escribir código más eficiente y limpio, especialmente cuando se manejan colecciones grandes de datos. Cada vez que puedas usar un generador en lugar de una lista, estarás optando por una opción más eficiente en términos de memoria.

¿Te resulta útil?