No sé __iter__ en python, quién me puede dar un buen ejemplo de código

mi código funciona mal

class a(object): def __iter(self): return 33 b={'a':'aaa','b':'bbb'} c=a() print b.itervalues() print c.itervalues() 

Por favor, trate de usar el código, en lugar del texto, porque mi inglés no es muy bueno, gracias

a. Deletrelo bien: no

  def __iter(self): 

pero:

  def __iter__(self): 

con __ antes y después iter .

segundo. Hacer el cuerpo correcto: no

 return 33 

pero:

 yield 33 

o devuelve iter ([33])

Si return un valor de __iter__ , devuelva un iterador (un iterable , como en la return [33] , es casi tan bueno pero no del todo …); o bien, yield valores 1+, convirtiendo a __iter__ en una función de generador (por lo que intrínsecamente devuelve un iterador de generador).

do. Llámalo bien: no

 a().itervalues() 

pero, por ejemplo:

 for x in a(): print x 

o

 print list(a()) 

itervalues es un método de dict, y no tiene nada que ver con __iter__ .

Si corrige los tres errores (!), El código funciona mejor ;-).

Algunas cosas acerca de su código:

  1. __iter debe ser __iter__
  2. Estás devolviendo ’33’ en la función __iter__ . En realidad debería estar devolviendo un objeto iterador . Un iterador es un objeto que sigue devolviendo valores diferentes cuando se llama a la función next() (tal vez una secuencia de valores como [0,1,2,3, etc.]).

Aquí hay un ejemplo de trabajo de un iterador:

 class a(object): def __init__(self,x=10): self.x = x def __iter__(self): return self def next(self): if self.x > 0: self.x-=1 return self.x else: raise StopIteration c=a() for x in c: print x 

Cualquier objeto de la clase a es un objeto iterador. Se supone que llamar a la función __iter__ devuelve el iterador, por lo que se devuelve a sí mismo . Como puede ver, la clase a tiene una función next() , por lo que este es un objeto iterador.

Cuando se llama a la siguiente función, sigue devolviendo valores consecutivos hasta que llega a cero, y luego envía la excepción StopIteration , que (apropiadamente) detiene la iteración.

Si esto parece un poco confuso, sugeriría experimentar con el código y luego revisar la documentación aquí: http://docs.python.org/library/stdtypes.html

Aquí hay un ejemplo de código que implementa el componente xrange:

 class my_xrange(object): def __init__(self, start, end, skip=1): self.curval = int(start) self.lastval = int(end) self.skip = int(skip) assert(int(skip) != 0) def __iter__(self): return self def next(self): if (self.skip > 0) and (self.curval >= self.lastval): raise StopIteration() elif (self.skip < 0) and (self.curval <= self.lastval): raise StopIteration() else: oldval = self.curval self.curval += self.skip return oldval for i in my_xrange(0, 10): print i 

Está utilizando esta función de idioma incorrectamente.

http://docs.python.org/library/stdtypes.html#iterator-types

Este enlace anterior explicará para qué se debe usar la función.

Puede intentar ver la documentación en su idioma nativo aquí: http://wiki.python.org/moin/Languages