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'的文件。不过,既然这个是懒惰的,为什么它这么快就失败了呢?
谢谢。
补充:哇,我做了一个懒惰的表达式!
g = (line.strip() for i in range(3) for line in open(str(i), 'r'))
2 个回答
6
通过调用 open()
打开的文件进行迭代是懒惰的,也就是说,它不会一次性把所有内容都读出来,而是需要的时候才会读取。而调用 open()
本身则是立即执行的,也就是说,一打开文件就会准备好。
6
来自文档:
在生成器表达式中使用的变量会在调用生成器对象的
next()
方法时被延迟计算,也就是说它们会在一个单独的环境中被处理,这和普通的生成器是一样的。不过,最左边的for
语句中的in
表达式会立即在当前环境中计算,这样如果它产生了错误,我们可以在处理生成器表达式的其他代码之前就看到这个错误。