2010-02-12 66 views
5

我想了解如何以及何时迭代器表达式得到评估。下面似乎是一个懒惰的表现:Python懒惰迭代器

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

这一个,但是失败建设:

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

我没有文件名为“XXX”。但是,由于这件事很懒,为什么它很快就失败了?

谢谢。 EDI:哇,我做了一个懒惰的!

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

对于我在范围内(1)的惰性是我在范围(3)中的3倍, – Jimmy 2010-02-12 04:31:34

回答

4

documentation:在发电机 表达式中使用

变量在 单独范围懒惰地评估当next() 方法被称为用于发电机 对象(以相同的方式作为用于 正常发电机)。然而,最左边的for 子句的in 表达在 电流范围立即评估,使得由它产生的误差 可以之前在 处理发电机表达式的代码的任何其它 可能的错误可以看出。

6

对呼叫返回的文件迭代到open()是惰性的。拨打open()不是。