Algo que nunca habia usado hasta que aprendí Python son los generadores, un egenerador no es otra cosa que una función especializada que va creando (generando) elementos de una secuencia a medida que es invocada. Su definición es similar a la de listas por comprensión con la diferencia que se utilizan paréntesis en lugar de corchetes.
>>> lista = range(10)
>>> print lista
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> cuadrados = [ numero * numero for numero in lista ]
>>> print cuadrados
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> cuadrados = ( numero * numero for numero in lista )
>>> print cuadrados
<generator object <genexpr> at 0xed75f0>
Alli podemos observar la definicion de una lista y de un generador y como se comportan de manera distinta, veamos entonces como usar un generador.
Por ejemplo vamos a crear un pqueño programa que genere numeros de IP aleatoriamente:
#!/usr/bin/python
import random
def generadorIPs(n):
for i in range(0,n):
a=random.randint(0,255);
b=random.randint(0,255);
c=random.randint(0,255);
d=random.randint(0,255);
yield str(a)+"."+str(b)+"."+str(c)+"."+str(d);
for i in generadorIPs(10):
print i;
Obeserve que en el caso de los generadores se devuelve el valor con yield, del que ya hablamos en una nota anterior.