2010-02-12 23 views
5

Estoy tratando de comprender cómo y cuándo se evalúan las expresiones de los iteradores. El siguiente parece ser una expresión perezosa:iterador perezosa de Python

g = (i for i in range(1000) if i % 3 == i % 2) 

Éste, sin embargo falla en la construcción:

g = (line.strip() for line in open('xxx', 'r') if len(line) > 10) 

no tengo el archivo llamado 'xxx'. Sin embargo, como esto es perezoso, ¿por qué está fallando tan pronto?

Gracias.

EDI: ¡Wow, hice un flojo!

g = (line.strip() for i in range(3) for line in open(str(i), 'r')) 
+0

para i en el rango (1) es tres veces más flojo que yo en el rango (3) – Jimmy

Respuesta

4

De los documentation:

Las variables utilizadas en la expresión generador se evalúan perezosamente en un ámbito separado cuando el método next() se llama para el objeto generador (de la misma manera como para normales generadores). Sin embargo, el in expresión de la for cláusula de más a la izquierda se evalúa inmediatamente en la alcance actual de modo que un error producido por él puede ser visto antes de cualquier otro posible error en el código que se encarga de la expresión generador.

6

La iteración sobre el archivo devuelto por la llamada a open() es perezoso. La llamada a open() no lo es.