Python 懒惰迭代器

8 投票
2 回答
8255 浏览
提问于 2025-04-15 19:11

我正在试着理解迭代器表达式是如何以及何时被计算的。下面这个看起来是一个懒惰的表达式:

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表达式会立即在当前环境中计算,这样如果它产生了错误,我们可以在处理生成器表达式的其他代码之前就看到这个错误。

撰写回答