Haciendo un iterador a medida en Python

Mientras no van llegando cosas que requiren más tiempo aquí va algo que puede resultar interesante, vamos a hacer nuestro propio iterador dinámico, que permita modificar su comportamiento desde el propio script, por ejemplo, si hacemos: for i in my_iterator(1,1000,"<<1"):

print i

Mostraría esto:

===============================================================================

1 2 4 8 16 32 64 128 256 512

===============================================================================

La idea es bastante simple, necesitamos una clase que sirva de iterador, necesita 2 métodos [ tipos_-_iterador ]: iter(): que devuelve un iterador ( un objeto que tenga el siguiente método ), por pura pereza, en este ejemplo se devolverá a si mismo ( self ) next(): este es el método del iterador, muestra el siguiente valor o levanta StopIteration

Si vamos escribiendo la clase, el iter y init iría así: class my_iterator:

def iter(self):

return self

def init(self, init,end,expr):

self.nextVal=init

self.end =end

self.expr=expr

Y atención que ahora viene el juego de manos!, para interpretar dinámicamente el argumento paso, utilizaremos exec() [ exec ], que se ejecuta en el entorno local, y que permite ejecutar código desde un string:     def next(self):

self.curr = self.nextVal

exec("self.nextVal = "+str(self.curr)+" "+self.expr)

if (self.curr != None)and( self.curr < self.end ):

return self.curr

else:

raise StopIteration

Mete el valor actual en self.curr (valor que se devolverá) y asigna self.nextVal al siguiente valor( en ese exec está el truco ).

Y eso es todo, saludos

untagged

Como evitar que un hilo de pyGTK bloquee a los demás [ tip ] » « Como funciona BitTorrent( 1 ): los archivos *.torrent