【python】迭代器与可迭代对象

【可迭代对象】

可以直接作用在for循环的对象,拥有__iter__方法,该方法返回一个迭代器(甚至可以只返回一个含__next__方法的对象)

使用 isinstance(obj, Iterable)判断是否为可迭代对象

【迭代器】

在可迭代对象基础上额外拥有__next__方法。

(事实上,一个迭代器并不需要有__iter__方法,只是出于多态的需要,__iter__方法原则上应该返回自身,详细参见 https://www.zhihu.com/question/44015086)

使用 isinstance(obj, Iterator)判断是否为迭代器

迭代器是lazy的,是一个数据流,只有在请求下一个数据的时候才会计算,甚至可以是个无限大的数据流。如果数据没有了,就返回StopIteration

可以使用 iter(obj)将一个可迭代对象转化为一个迭代器

【原理】

for循环,for i in obj。里面的obj是iterable。

调用iter(obj)得到一个迭代器(甚至不非要是迭代器,只要实现了__next__方法)然后不断调用next方法。

iter函数首先检查obj是否有__iter__方法,如有,则返回obj.__iter__(),如没有,检查是否有__getitem__方法,如果有该方法返回一个下标迭代器。

for i in iterable or for i in iterator??

如果想重头遍历,就要用for i in iterable(注意这个iterable的__iter__方法不能返回自己哦),返回一个新东西。如果想接着遍历,就要用for i in iterator。

原文地址:https://www.cnblogs.com/yesuuu/p/15798288.html