[Python-de] generatoren unverstaendnis

Oliver Horn oliver.horn at gmx.net
Mit Jul 2 01:43:11 EDT 2003


Hi,

wie Gerhard bereits gesagt hat, stellt deine Liste (mit der ersten 
next-Variante) eigentlich keine Liste sondern vielmehr selbst ein 
Iterator-Objekt dar.

Iterator-Objekte sind eigentlich nur Hilfsobjekte, die von __iter__ 
zurückgeliefert werden, um das eigentliche Objekt aufzählbar zu machen.

Die Idee einer Generator-Funktion ist es, dir genau das zu ersparen. 
Eine Generator-Funktion liefert von ganz alleine ein Iterator-Objekt 
zurück. Mit dem yield-Statement setzt du gewissermaßen jeweils den 
nächsten Wert ab.

class Liste:
     def __init__(self, *_values):
         self.Values = _values
     def __iter__(self):
         Index = 0
         while len(self.Values) > Index:
             # Iterator liefert Tupel (Index, Wert) zurück
             yield (Index, self.Values[Index])
             Index += 1

if __name__ == "__main__":
     liste = Liste("Eins", "zwei", "drei").__iter__()
     print liste.__iter__() # das Iterator-Objekt der Generator-Funktion
     for x in liste:
         print x

liefert dir dann so etwas wie:

<generator object at 0x007BB388>
(0, 'Eins')
(1, 'zwei')
(2, 'drei')


Bye
Oliver