Also ich habe Iteratoren für eine Weile geschrieben, und ich dachte, dass ich sie verstanden habe. Aber ich habe heute Abend mit einigen Problemen zu kämpfen, und je mehr ich damit spiele, desto verwirrter werde ich.Das Iterator-Protokoll. Ist es dunkle Magie?
Ich dachte, dass Sie für einen Iterator implementieren mussten __iter__
und next
(oder __next__
). Und wenn Sie zuerst versuchten, über den Iterator zu iterieren, würde die __iter__
Methode aufgerufen werden, und dann würde next
aufgerufen werden, bis eine StopIteration
ausgelöst wurde.
Wenn ich diesen Code ausführen, obwohl
class Iter(object):
def __iter__(self):
return iter([2, 4, 6])
def next(self):
for y in [1, 2, 3]:
return y
iterable = Iter()
for x in iterable:
print(x)
Der Ausgang 2 4 6
ist. So wird __iter__
aufgerufen, aber nicht next
. Das scheint mit der Dokumentation übereinzustimmen, die ich gefunden habe here. Aber dann wirft das eine Menge Fragen auf.
Spezifisch, was ist der Unterschied zwischen einem Containertyp und Iterator, wenn es nicht die Implementierung von next
ist? Woher weiß ich vorher, in welcher Richtung meine Klasse behandelt wird? Und am wichtigsten, wenn ich eine Klasse schreiben möchte, wo meine next
Methode aufgerufen wird, wenn ich for x in Iter()
verwende, wie kann ich das tun?
Ich denke, ich komme wieder um. Daher sind alle Iteratoren iterabel, aber nicht alle Iteratoren sind Iteratoren. Und wenn ich über ein iterables iteriere, iteriere ich wirklich über alles, was seine iter-Methode zurückgibt. Was kann ein Iterator oder ein Generator? –
Korrigieren. Alle Iteratoren sind iterierbar. Nicht alle Iterables sind Iteratoren (z. B. sind Listen iterierbar, aber sie sind keine Iteratoren, da sie "next" nicht implementieren).Die Iteration über ein Objekt wird auf alle Dinge ausgeführt, die zurückgegeben werden, indem 'iter() 'für das Objekt aufgerufen wird. Das * muss * einen Iterator zurückgeben (Generatoren sind eine Art Iterator). – wim
Danke. Ich denke, das wusste ich zu Beginn der Nacht, aber ich dachte auch zu Beginn der Nacht, dachte aber auch an ein paar andere Dinge, die sehr, sehr falsch waren. –