Generadores en Python

Hoy quiero mostraros cómo usar generadores en Python.

¿Qué son los generadores?

Son funciones que nos permitirán obtener sus resultados poco a poco. Es decir, cada vez que llamemos a la función nos darán un nuevo resultado. Por ejemplo, una función para generar todos los números pares que cada vez que la llamemos nos devuelva el siguiente número par. ¿Podemos construir una función que nos devuelva todos los números pares? Esto no es posible si no usamos generadores. Como sabemos los números pares son infinitos.

¿Para qué sirven los generadores?

Pues, como el propio nombre indica, para generar datos en tiempo de ejecución. Además también podemos acelerar búsquedas y crear bucles más rápidos. Por este motivo, utilizar range es más lento que usar xrange. range genera todos los valores del rango y los devuelve en un array. En cambio, xrange genera cada valor del rango cuando se le solicita.

¿Cómo se construyen los generadores?

Para construir generadores sólo tenemos que usar la orden yield. Esta orden devolverá un valor (igual que hace return) pero, además, congelará la ejecución de la función hasta la próxima vez que le pidamos un valor.

La mejor forma de entenderlo es creando uno. Por ejemplo, un generador que devuelva números pares:

# Definimos nuestra función
def pares():
    index = 1
    # En este caso definimos un bucle infinito
    while True:
        # Devolvemos un valor
        yield index*2
        index = index + 1


if __name__ == '__main__':
    # Para probarlo simplemente iteramos sobre la función
    for i in pares():
        print i

Sencillo, ¿no? Podemos hacer ejemplos más complejos. Por ejemplo, un generador que nos devuelva múltiplos del número pasado como argumento:

def multiplos_de(n):
    index = 1
    while True:
        yield index*n
        index = index + 1


if __name__ == '__main__':
    # En este caso genera múltiplos de 7
    for i in multiplos_de(7):
        print i

    # Bastaría usar multiplos_de(5) para múltiplos de 5
    # O multiplos_de(10) para generar múltiplos de 10

Espero que os sea útil. ¡Saludos!