这篇文章写的清晰明白,推荐:
迭代器表示一连串数据流对象,重复调用__next__
方法,逐个返回数据流中的成员。迭代器大概有两种类型
- 必须具有
__iter__
方法,用来返回该迭代器对象自身。必须具有__next__
方法,从容器中返回下一项。isinstance(p,collections.Iterator)
, 可以用来判断一个对象是否是可迭代对象。 - 生成器 函数中有yield表达式, 生成器一定是迭代器(反之不成立)
使用
next
不断获取数据到没有数据可用时,则将引发StopIteration
异常 ,for
循环或其他内置函数进行遍历取值时,会自动处理异常,正常结束遍历。
可迭代对象是指实现了__iter__
魔法方法的对象,不必须实现 __next__
, 所以一个迭代器对象,一定是可迭代对象,判断一个可迭代对象可以通过 isinstance(p,collections.Iterable)
进行。
for..in
遍历一个对象的时候,首先回去找该对象的 __iter__
方法,如果__iter__
方法存在,则通过调用返回对象的__next__
方法进行遍历。如果不存在 __iter__
迭代器协议,Python
的解释器就会去寻找__getitem__
来迭代对象,如果连__getitem__
都没有定义,这解释器就会报对象不是迭代器的错误。