【python】一文弄懂迭代器iteror(__next__)对象与可迭代iterable对象

一、定义区别

刚开始学的经常会被迭代器与可迭代对象弄混淆,下面清晰的介绍两者的不同。

迭代器 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()函数。

扫描二维码关注公众号,回复: 4505777 查看本文章

三、将可迭代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函数,其返回的是一个迭代器对象。

猜你喜欢

转载自blog.csdn.net/lyl771857509/article/details/84843874