2012-04-11 9 views
8

Para comprender mejor generador de Python que estoy tratando de poner en práctica las instalaciones en el módulo de itertools, y se meten en problemas con izip:¿Por qué esta implementación de izip() no funciona?

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 

Mi código utiliza la línea de error, y la implementación de referencia (dado en el manual) usa la línea OK, sin considerar otras pequeñas diferencias. Con este fragmento:

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

Mis salidas de código:

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

, mientras que la salida esperada es:

(1, 4) 
(2, 5) 

¿Qué hay de malo en mi código, por favor?

Respuesta

12

La razón por la que su implementación no funciona es porque la excepción StopIteration causada por uno de los iterables que se están agotando se emite dentro de una expresión del generador. Solo terminará la expresión del generador, no la función del generador adjunto.

+2

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

+0

@Sven Marnach: ¡Gracias! Su explicación es concisa y muy al grano. – wdscxsj

+0

@Steven Rumbalski: la página vinculada me ayuda a entender mucho mejor. ¡Gracias! – wdscxsj

Cuestiones relacionadas