python可迭代对象与迭代器

什么是可迭代对象

可迭代对象:能使用for进行循环访问的对象,比如:list、tuple、dict、str等,可以迭代的对象都有一个__iter__方法,该方法会返回一个迭代器。
判断一个对象是否可以迭代,如果可以迭代则a的值为Ture。

from collections import Iterable
L = [1,3,5]
a = isinstance(L,Iterable)
#如果我们定义了一个类,里面含有__iter__这个方法,则属于该类的对象使用上述判断方法a的值也会为Ture
class Test1(object):
    def __iter__(self):
        pass
test1 = Test1()
a = isinstance(test1,Iterable)

什么是迭代器

返回可迭代对象数据的对象,使用for循环遍历可迭代对象时,都会调用迭代器的__next__方法
在python3中如果有一个对象中含有__iter__方法和__next__方法(python2中对next方法),则该对象属于迭代器对象,使用Iterator进行判断

from collections import Iterator
class Test2(object):
    def __iter__(self):
        pass
    def __next__(self):
        pass
test2 = Test2()
a = isinstance(test2,Iterator)

自定义一个可迭代对象

class Test3Iterator(object):
    """
    Test3的迭代器
    """
    def __init__(self,start,end):
        self.index = start
        self.end = end
    def __iter__(self):
        return  self
    def __next__(self):
        #使用for循环每遍历一次都会执行这个方法一次
        if self.index < self.end:
            self.temp = self.index
            self.index += 1
            return self.temp
        else:
            #一旦抛出StopIteration()这个异常,则for停止遍历
            raise StopIteration()


class Test3(object):
    """
    Test3是可迭代的对象
    """
    def __init__(self,start,end):
        self.start = start
        self.end = end

    def __iter__(self):
        #返回一个迭代器对象
        return Test3Iterator(self.start,self.end)

for i in Test3(1,10):
    #输出1~9
    print(i)

for循环原理

事实上for循环底层的原理就是得到可迭代对象的迭代器,不断的执行迭代器的__next__方法,直到抛出异常,我们可以使用while循环来模拟这个过程。
我们可以使用iter()来得到可迭代对象的迭代器。

test3_iterator = iter(Test3(1,10))
while(True):
    try:
        i = test3_iterator.__next__()
        print(i)
    except StopIteration():
        break

其他的补充

一个对象既可以是可迭代对象也可以是一个迭代器,这种形式的可迭代对象只能用for遍历一次。

class Test4(object):
    """
    Test4既是可迭代的对象也是迭代器
    """
    def __init__(self,start,end):
        self.index = start
        self.end = end

    def __iter__(self):
        #返回一个迭代器对象,即返回自己
        return self
    def __next__(self):
        #使用for循环每遍历一次都会执行这个方法一次
        if self.index < self.end:
            self.temp = self.index
            self.index += 1
            return self.temp
发布了14 篇原创文章 · 获赞 0 · 访问量 249

猜你喜欢

转载自blog.csdn.net/pnd237/article/details/103812392
今日推荐