2010-02-12 7 views
5

J'essaie de comprendre comment et quand les expressions d'itérateur sont évaluées. Ce qui suit semble être une expression paresseuse:Python paresseux itérateur

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

Celui-ci, échoue cependant sur la construction:

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

Je n'ai pas le fichier nommé 'xxx'. Cependant, puisque cette chose est paresseuse, pourquoi échoue-t-elle si tôt?

Merci. EDI: Wow, j'ai fait un paresseux!

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

pour i dans la gamme (1) est trois fois plus paresseux que pour i dans la gamme (3) – Jimmy

Répondre

4

De l'documentation:

Les variables utilisées dans le générateur expression sont évaluées paresseusement dans un champ séparé lorsque la méthode next() est appelée pour le générateur objet (de la même façon que pour normale générateurs). Cependant, l'expression de in le plus à gauche for clause est évaluée immédiatement dans le champ d'application de courant de sorte qu'une erreur produite par on peut voir avant toute erreur autre possible dans le code qui gère l'expression du générateur.

6

L'itération sur le fichier renvoyé par l'appel à open() est paresseux. L'appel au open() ne l'est pas.