Iterabilidad en Python

Estoy tratando de entender Iterability en Python.

Según tengo entendido, __iter__() debe devolver un objeto que tenga el método next() definido, que debe devolver un valor o boost la excepción StopIteration . Así escribí esta clase que satisface ambas condiciones.

Pero no parece funcionar. ¿Qué está mal?

 class Iterator: def __init__(self): self.i = 1 def __iter__(self): return self def next(self): if self.i < 5: return self.i else: raise StopIteration if __name__ == __main__: ai = Iterator() b = [i for i in ai] print b 

Su código actual parece funcionar. En su lugar, te mostraré algunos más iteradores / generadores.

El más simple construido con exactamente su comportamiento.

 Iterator2 = xrange(2,5) 

Una traducción directa de tu clase a un generador.

 def Iterator3(): i = 1 while i < 5: i += 1 yield i 

un generador compuesto de generadores en la biblioteca estándar de python

 import itertools Iterator4 = itertools.takewhile( lambda y : y < 5, itertools.count(2) ) 

Una expresión generadora simple (no muy emocionante ...)

 Iterator5 = ( x for x in [2, 3, 4] ) 

Tu clase de iterador es correcta. Solo tienes un error tipográfico en esta statement:

 if __name__ ==' __main__': 

Hay un espacio en blanco en la cadena ‘__main__’. Es por eso que su código no se ejecuta en absoluto.

Nunca seré mayor que 5 si no lo incrementas en next()

Creo que en la mayoría de los casos podría ser suficiente escribir una función de generador que use el rendimiento en lugar de escribir un iterador de pleno derecho.

Su código tiene dos problemas:

  • if name == '__main__' : (comillas faltantes)
  • def next . . . : no me incrementas en ninguna parte