2016-06-20 19 views
6

Ich verwende Ausbeute, um den nächsten Wert in der nächsten Funktion in meiner Klasse zurückzugeben. Aber es gibt den nächsten Wert nicht zurück, es gibt das Generatorobjekt zurück. Ich versuche Iteratoren und Ausbeute besser zu verstehen. Ich könnte es falsch machen. Bitte guck dir das an.wenn ich von innen __next__ ergebe. Warum gibt es ein Generatorobjekt zurück?

class MyString: 
    def __init__(self,s): 
     self.s=s 

    def __iter__(self): 
     return self 

    def __next__(self): 
     for i in range(len(self.s)): 
      yield(self.s[i]) 

r=MyString("abc") 
i=iter(r) 
print(next(i)) 

Das gibt:

Generator Objekt __next__ bei 0x032C05A0

+1

['__next__' gibt das nächste Element im Iterator zurück] (https://docs.python.org/3/library/stdtypes.html#iterator.__next__), so dass' __next__' ein Generator nicht wirklich sinnvoll ist, oder gut, es bedeutet, dass jeder Wert Ihres "MyString" Iterators ein Generator ist. –

+2

MyString sollte '__next__' nicht definieren. '__next__' ist für Iteratoren, nicht für Iterables. Ebenso sollte es nicht für "__iter__" zurückkehren. – user2357112

Antwort

4

next ziemlich nennt nur __next__() in diesem Fall. Der Aufruf von __next__ auf Ihrem Objekt wird den Generator starten und ihn zurückgeben (zu diesem Zeitpunkt ist keine Magie getan).


In diesem Fall Sie könnte der Lage sein, um wegzukommen mit nicht __next__ überhaupt definieren:

class MyString: 
    def __init__(self,s): 
     self.s=s 

    def __iter__(self): 
     for i in range(len(self.s)): 
      yield(self.s[i]) 
     # Or... 
     # for item in self.s: 
     #  yield item 

Wenn Sie eine iterator__iter__ und __next__ (zu definieren, anstatt einfach nur benutzen wollte (iterable), möchten Sie wahrscheinlich so etwas tun:

class MyString: 
    def __init__(self,s): 
     self.s = s 
     self._ix = None 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self._ix is None: 
      self._ix = 0 

     try: 
      item = self.s[self._ix] 
     except IndexError: 
      # Possibly reset `self._ix`? 
      raise StopIteration 
     self._ix += 1 
     return item 
+0

@MosesKoledoye - Willst du mir sagen, dass ich es hinzufügen oder fragen soll, warum ich es hinzugefügt habe? :-) – mgilson

+0

Ich hatte den letzten Schnitt nicht gesehen. Fragte, warum es fehlte –

+1

@MosesKoledoye - Ja, es war ein Versehen in der ursprünglichen Post, die ich korrigiert habe, während Sie kommentierten. Ich erkannte auch, dass der Aufruf von 'iter (mystring)' wahrscheinlich die Iteration nicht zurücksetzen sollte ... Danke, dass ich meinen Rücken bewachte. :-) – mgilson