7

我试图了解迭代器表达式的评估方式和时间。以下似乎是一个懒惰的表达:

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'))
4

2 回答 2

6

调用返回的文件的迭代open()是惰性的。调用open()不是。

于 2010-02-12T04:24:26.950 回答
6

文档中:

next() 当为生成器对象调用该方法时,生成器表达式中使用的变量会在单独的范围内延迟计算(与普通生成器的方式相同)。但是,in 最左边for 子句的表达式会立即在当前范围内求值,以便在处理生成器表达式的代码中的任何其他可能错误之前可以看到由它产生的错误。

于 2010-02-12T04:24:48.773 回答