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。