Python range 不是 iterator
这篇文章解释了为什么 Python 3 中 range 产生的对象不是 iterator。
- range 和 iterators 都是 lazy 的(延时求值),但是他们最重要的区别是 iterator 是一次性的,而 range 不是。
- 你可以写
iter(range(3))
或者tuple(range(3))
,但不能写next(range(3))
,后者会报错 TypeError。 - range 对象定义了 start,end,step,以便我们遍历的时候算出来,从这点来说,range 是 lazy 的。但 iterator 用过一次就不能用了,例如
myiterator = (n for n in (0, 1, 2)); 0 in myiterator; 0 in myiterator;
可能会报错。但myrange=range(3); 0 in myrange; 0 in myrange;
是允许的。 - 结论:range 是 iterable 的,并且是 lazy iterable 的,但它不是 iterator。