a. Formulieren Sie es richtig: nicht
def __iter(self):
aber:
def __iter__(self):
mit __
vor und nach iter
.
b. Machen Sie den Körper rechts: nicht
return 33
aber:
yield 33
oder return iter ([33])
Wenn Sie return
ein Wert von __iter__
, einen Iterator zurückgeben (ein iterable, wie in return [33]
, ist fast so gut, aber nicht ganz ...); oder sonst, yield
1+ Werte, wodurch __iter__
zu einer Generatorfunktion gemacht wird (so dass es intrinsisch einen Generator-Iterator zurückgibt).
c. Nennen Sie es richtig: nicht
a().itervalues()
aber, z.B .:
for x in a(): print x
oder
print list(a())
itervalues
ist ein Verfahren, dict, und hat nichts mit __iter__
zu tun.
Wenn Sie alle drei (!) Fehler beheben, funktioniert der Code besser ;-).
Aber wenn Er kommt gerade zurück 33, ist das wirklich ein * Iterator *? –
Nun, wenn Sie ** 33 ergeben, dann ja, dann wird die Methode ein Generatorausdruck, der einen Iterator ergibt. Wenn du zurückkommst [33], ist eine Liste sicherlich iterierbar, also funktioniert es auch. – shylent
@Goose und @Shylent, yep: 'yield 33' macht '__iter__' zu einer Generatorfunktion (** not ** generator _expression_ - das ist ein anderes Konstrukt ;-), also gibt es einen Generator, der ein Iterator ist; 'return [33]' gibt einen iterierbaren, aber keinen Iterator zurück, also ist das ein wenig unvollkommen - Editier-Antwort, um dieses Problem zu beheben! -) –