2012-04-11 10 views
8

Zum besseren Verständnis von Python-Generator Ich versuche Einrichtungen im itertools Modul zu implementieren und in Schwierigkeiten geraten mit izip:Warum funktioniert diese Implementierung von izip() nicht?

def izip(*iterables): 
    its = tuple(iter(it) for it in iterables) 
    while True: 
     yield tuple(next(it) for it in its) # ERROR 
     # yield tuple(map(next, its)) # OK 

die Fehlerzeile Mein Code verwendet, und die Referenz-Implementierung (im Handbuch) verwendet die OK-Zeile, ohne andere kleine Unterschiede zu berücksichtigen. Mit diesem Code-Schnipsel:

for x in izip([1, 2, 3], (4, 5)): 
    print x 

Mein Code Ausgänge:

(1, 4) 
(2, 5) 
(3,) 
() 
() 
... # indefinite() 

, während die erwartete Ausgabe ist:

(1, 4) 
(2, 5) 

Was ist los mit meinem Code, bitte?

Antwort

12

Der Grund, warum Ihre Implementierung nicht funktioniert, liegt daran, dass die Ausnahme StopIteration, die durch die Erschöpfung eines der Iterables verursacht wird, in einem Generatorausdruck ausgelöst wird. Es wird nur den Generatorausdruck beenden, nicht die umschließende Generatorfunktion.

+2

@wdscxsj: siehe http://www.velocityreviews.com/forums/t723967-generator-expressions-vs-comprehensions.html –

+0

@Sven Marnach: Danke! Ihre Erklärung ist kurz und sehr auf den Punkt. – wdscxsj

+0

@Steven Rumbalski: Die verlinkte Seite hilft mir, viel besser zu verstehen. Vielen Dank! – wdscxsj

Verwandte Themen