首页>>学员天地
一、迭代器和可迭代对象
当谈论 Python 中的迭代器(iterator)和可迭代对象(iterable)时,你很可能会听到有人重复 range 是迭代器的误解。我认为这是非常严重误解,
在 Python 中,可迭代对象就是可以迭代的任何数据,如字串、列表、元组等,而迭代器则是执行迭代的代理。
Iterables are able to be iterated over. Iterators are the agents that perform the iteration.
1、可以使用iter函数从任何可迭代对象中获取迭代器:
2、对于迭代器,可以用next()获得它的下一个元素,如果没有更多的元素了, 则会抛出一个stop iteration exception:
3、所有的迭代器都是可迭代对象,因此可以从一个迭代器中得到一个迭代器,也可以遍历一个迭代器:
4、迭代器是有状态的,在循环遍历一次迭代器后,如果尝试再次循环,它将为空:
5、生成器是一种创建迭代器的简单方法:
二、range对象
1、range对象(Python 2中的xrange)是可迭代对象,可以像任何其他可迭代对象一样循环使用:
2、可以从range对象得到一个迭代器,即range迭代器对象,但 range 对象本身不是迭代器,所以不能在 range 对象上调用 next():
3、遍历一个 range 对象,也不会“消耗”它的元素:
4、range 对象和生成器的区别
下面是一个 range 对象和一个生成器(是一种迭代器):
1)与生成器不同,range 对象有长度,并且可以被索引:
2)与生成器(迭代器)不同,可以询问range对象是否包含某元素而不改变他们的状态:
5、什么range对象?
range 对象从某种意义上说是“惰性的”,因为它不会生成创建时包含的每个数字,当我们在循环中需要的时候,它才将这些数字返回给我们。
range 对象可以被称为懒序列,因为range 是序列(如列表,元组和字符串),但并不包含任何内存中的内容,而是通过计算来回答问题。
三、总结
1、如果可以循环遍历某个对象,这是一个可迭代对象(iterable)。
2、如果正在循环遍历的对象是在循环的时候计算出来,那么这是一个惰性可迭代对象(lazy iterable)。
3、如果可以传递一些东西给 next 函数,它就是一个迭代器(这是最常见的惰性可迭代对象)。
4、如果可以循环多次而不会“耗尽”,它不是一个迭代器。如果你不能将某些东西传递给 next 函数,那么它不是一个迭代器。
5、range 对象不是迭代器。如果你正在指导别人关于 range 对象的知识,请不要使用“迭代器”一词,这会让人十分困惑,并可能导致他人开始滥用“迭代器”这个词。
上一篇: 50条有趣且实用的Python一行代码 下一篇: 彻底理解 Python 生成器