一、定义区别
刚开始学的经常会被迭代器与可迭代对象弄混淆,下面清晰的介绍两者的不同。
迭代器 Iterator (对象):如果一个对象同时拥有__iter__ 和 __next__方法的(对象),也就是说可以被next()
函数调用并不断返回下一个值的对象称为迭代器。
可迭代iterable (对象):如果一个对象拥有__iter__方法,其是可迭代对象,同时凡是可作用于for
循环的对象都是Iterable对象。
注:迭代器是可迭代的(拥有__iter__ 和 __next__方法自然的拥有了__iter__方法),但是可迭代的不一定是迭代器。
二、如何判别一个对象是迭代器还是可迭代的
1:可以使用isinstance()
判断一个对象是否是Iterable
对象
一般的容器都是可迭代的,所有能用于for循环的对象都是可迭代的,比如:list,tuple,dict,set,str。当然这些都是属于容器。
下面看代码:
2:也可以使用isinstance()
判断一个对象是否是Iteror对象
前面讲到可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以使用isinstance()
判断一个对象是否是Iterator
对象:
可以看出生成器是迭代器,而list,tuple,dict,str,set等不属于迭代器iteror ,因为他们也不能调用next()函数。
三、将可迭代iterable的对象转为迭代器iteror对象。
上面提到list ,tuple,dict,set,str均不是iteror,那么可以使用iter函数可以将iterable对象转为iteror。
四 、示例演示
class Test():
def __init__(self,data=1):
self.data = data
def __iter__(self):
return self
def __next__(self):
if self.data > 7:
raise StopIteration
else:
self.data+=1
return self.data
for item in Test(5):
a=item
print(item)
定义一个Test类,支持__iter__方法和__next__方法,即他是个迭代器类。此类可以在for循环使用,其原因是类中定义了__iter__函数,返回一个迭代器自身的对象,以及__next__函数,对迭代器对象进行next函数调用。通过对for循环中进行调试可以发现其过程是:先进行__init__初始化————》再调用 __iter__ 返回迭代器自身 —————》最后循环调用__next__函数。实际上for循环只是循环调用。
说到这里可能有人纳闷了,对象拥有__iter__函数不应该是iterable对象吗?iter(可迭代对象)不应该返回一个iteror迭代器吗?这里面可能涉及到多态问题。上面的类Test同时实现了__iter__和__next__函数,肯定是个迭代器类,迭代器对象也是可迭代对象,这是没毛病的。但是在迭代器中__iter__返回的是迭代器自身,这也是没毛病的,多态嘛。
比如一个列表a=[1,2,3], 是个可迭代对象,其肯定有__iter__方法,对其调用iter函数,其返回的是一个迭代器对象。