Zugriff auf durchlaufenen Iterator

21/09/2010 - 16:03 von Thomas Guettler | Report spam
Hallo,

wenn man einen Iterator versucht zweimal zu durchlaufen, funktioniert das
nicht.

Warum wird an der mit ### gekennzeichneten Stelle
keine Exception geworfen? Schließlich ist es sinnlos
den Iterator nochmal zu durchlaufen.

def yield_up_to_ten():
for i in range(10):
yield i

print 'iterator'
result=yield_up_to_ten()
if 1 in result:
print ' 1 is in result'
if not 1 in result: #### Exception aus meiner Sicht sinnvoll.
print ' 1 is **not** in result?'

# Solution:
print 'set'
result=set(yield_up_to_ten())
if 1 in result:
print ' 1 is in result'
if 1 in result:
print ' 1 is always in result!'


Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de
 

Lesen sie die antworten

#1 Florian Laws
21/09/2010 - 16:30 | Warnen spam
On 2010-09-21, Thomas Guettler wrote:
Hallo,

wenn man einen Iterator versucht zweimal zu durchlaufen, funktioniert das
nicht.

Warum wird an der mit ### gekennzeichneten Stelle
keine Exception geworfen? Schließlich ist es sinnlos
den Iterator nochmal zu durchlaufen.

def yield_up_to_ten():
for i in range(10):
yield i

print 'iterator'
result=yield_up_to_ten()
if 1 in result:
print ' 1 is in result'



der in-Operator durchlàuft nicht den kompletten Iterator,
sondern bricht nach dem ersten Vorkommen von 1 ab.
Somit erzeugt Dein result-Objekt im Folgenden noch die Zahlen 2 bis 9.


if not 1 in result: #### Exception aus meiner Sicht sinnvoll.
print ' 1 is **not** in result?'



Erst hier ist der Iterator komplett durchlaufen.

Anschließende Aufrufe von result.next() werfen denn auch die
StopIteration Exception.

Aber selbst wenn Du jetzt

if 1 in result:
print ' 1 is in result'

nochmal aufrufst, bekommst Du die StopIteration Exception nicht zu
sehen, weil der in-Operator sie intern abfàngt und als Signal benutzt
dass die Aufzàhlung, die der Iterator erzeugt hat, nun zu Ende ist.

Ein durchlaufener Iterator ist somit für in (und for) nicht von
einer leeren Liste zu unterscheiden.
Das ist durchaus erwünscht so.

Grüße,

Florian

Ähnliche fragen