##”可迭代对象”与”迭代器”

Python中迭代器指的是实现了__iter__协议与next()方法的对象,其中__iter__协议中返回对象自身(self),next()方法每次返回单一元素,直至所有元素遍历结束,抛出’StopIteration’异常结束。

可迭代对象是一种更宽泛的定义,只要对象实现了__iter__协议,返回一个迭代器(并不像迭代器一样必须返回自身self)用来遍历自己的元素集合,那这个对象就是可迭代的对象,也意味着可以直接通过for item in obj...的方式遍历。

##iter(a) is iter(a)?

>>a = [1, 2, 3]
>>iter(a) is iter(a) #(1)
>>False
>>b = iter(a)
>>iter(b) is iter(b) #(2)
>>True

以上代码中的a可以是任意container型对象(list, tuple, set, dict…)。可以看到(1) 和 (2)的结果是不同的。

原因是:

iter调用意味着获取对象的迭代器(即__iter__协议返回的迭代器)
container实现了__iter__协议,是可迭代的对象,通过iter(a)调用,返回了对象a的迭代器
每次iter(a)都返回一个a的迭代器,是不同的对象(虽然他们功能一样),所以(1)是False,因为他们是不同的对象
(2)对一个迭代器进行iter调用,根据迭代器的定义,迭代器的__iter__协议返回的是迭代器对象自身
所以(2)iter(b) is iter(b)是True, 因为b是迭代器,每次iter(b)返回的都是b自身

文章目录