Tutorial 13, Generadores.

Hola a tod@s de nuevo, perdón por el retraso, ya se que hoy escribo mas tarde de lo que lo suelo hacer normalmente, pero tenía que hacer unas solicitudes en un instituto, bueno a lo que vamos, en esta ocasión, os voy a hablar sobre los generadores.


Un generador, es un tipo especial de función que en vez de devolver un sólo valor con "return", como todas las funciones, devuelve un objeto iterable, como si de una lista, tupla o diccionario se tratase.

La única diferencia a la hora de declararlas, es que en vez de usar la palabra reservada "return" usamos la palabra reservada "yield".

def generador(a, b):

       while a>b:

             yield b
             b+=1 

En este caso devuelve todos los valores de b, hasta que sea mayor que a, por lo cual si hacemos:

generador(8, 5)

Devolverá  5, 6, 7

No intentéis hacer un:

print generador(8, 5)

Es un generador y como tal no se puede imprimir, si lo intentáis no os tirará una excepción, pero sólo conseguiréis la posición de memoria donde se a guardado.

La mayor finalidad de los generadores es usarlos en un for(lo expliqué en el tutorial 4), por ejemplo:

for a in generador(8, 5):
     print a

Aquí si funcionaría e imprimiría los valores, por ejemplo, en python, hay un generador por defecto llamado range() que se usa para especificar un rango de números, por ejemplo:

for a in range(0, 15):
        print "esto se ejecutará 15 veces"

De esta forma conseguimos "emular" el típico for de muchos lenguajes como el de C o el de Java.

Bueno chic@s, espero que os haya gustado el tutorial de hoy, perdonad me la tardanza pero es que hoy he ido muy mal de tiempo, bueno, un abrazo y hasta el siguiente tutorial, mañana hablaré sobre como gestionar las excepciones que nos pueda tirar el interprete de python, un abrazo y hasta mañana.

7 comentarios:

Dr Coloso dijo...

¿Se usa mucho en Python esto?

Francisco Dominguez Lerma dijo...

Depende del programador, habrá gente que lo use mucho y gente que lo use menos, a mi personalmente me parece una construcción muy, pero que muy interesante.

Tuus dijo...

He querido meter el resultado del generador, en una lista.
Para lo que he recorrido con "el for del generador" una lista
previamente definida.

¿Hay forma de definir una lista sin fijar el numero de
elementos que tendrá?

def generador(a,b):

.....while a>b:
........yield b
........b+=1

x=0
lista=[0,0,0,0,0,0]
for a in generador (8,5):
....lista[x]=a
....x+=1

Tuus dijo...

Bueno como no se declarar una lista con el numero de elementos sin fijar, he hecho esta chapucilla.

http://pastebin.com/TZPr7nS5

Declaro una lista de un elemento=0
elimino el primer elemento
Y añado un nuevo elemento por cada resultado del generador. ;)

Francisco Dominguez Lerma dijo...

Hola Tuus.

Pues si, hay una forma de definir una lista sin darle ningún elemento previo, he visto que has hecho un:

lista=[0]

Pues no hace falta ese cero, para crear una lista vacía es suficiente con un:

lista=[]

Eso si, los corchetes si son imprescindibles para definir bien que es una lista.

¡ Saludos !

Tuus dijo...

Genial! Creí haberlo probado, pero se ve que no lo había hecho.

Muchas gracias. Un saludo.

Francisco Dominguez Lerma dijo...

De nada Tuus, gracias a ti.

Un saludo.