method iter explicacion are python iterator yield

python - explicacion - ¿Cómo implementa esta clase el método “__iter__” sin implementar “next”?



python yield explicacion (2)

Tengo el siguiente código en django.template:

class Template(object): def __init__(self, template_string, origin=None, name=''<Unknown Template>''): try: template_string = smart_unicode(template_string) except UnicodeDecodeError: raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.") if settings.TEMPLATE_DEBUG and origin is None: origin = StringOrigin(template_string) self.nodelist = compile_string(template_string, origin) self.name = name def __iter__(self): for node in self.nodelist: for subnode in node: yield subnode def render(self, context): "Display stage -- can be called many times" return self.nodelist.render(context)

La parte sobre la que estoy confundido está abajo. ¿Cómo funciona este método de __iter__ ? No puedo encontrar el next método correspondiente.

def __iter__(self): for node in self.nodelist: for subnode in node: yield subnode

Esta es la única forma en que sé cómo implementar __iter__ :

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 ainst = a() for item in aisnt: print item

En tus respuestas, intenta usar ejemplos de código en lugar de texto, porque mi inglés no es muy bueno. Gracias.


De los docs :

Si el método __iter__() un objeto contenedor se implementa como un generador, devolverá automáticamente un objeto iterador (técnicamente, un objeto generador) que suministra los __iter__() y next() .


Ese método __iter__ devuelve un generador de python (consulte la documentation ), ya que utiliza la palabra clave de yield . El generador proporcionará el método next () automáticamente; citando la documentación:

Lo que hace que los generadores sean tan compactos es que los métodos __iter __ () y next () se crean automáticamente.

EDITAR:

Los generadores son realmente útiles. Si no está familiarizado con ellos, le sugiero que lea sobre ellos y juegue con un código de prueba.

Aquí hay más información sobre los iteradores y generadores de .