python3 迭代器(自定义迭代器)

1.迭代器
        1.什么是迭代器?
            1.迭代器是用于迭代数据的
                -记录每次访问的数据,以及返回下一个数据
                -迭代器通过__next__方法取得下一个指向的值
            2.迭代器也称迭代对象,迭代对象指可以通过for .. in ..等语句将数据内容
            显示出来的,这样的过程叫迭代,把这个可以提供给我们使用数据的这个对象
            称为迭代对象,

        2.常用数据类型的可迭代性有那些?
            列表,元祖,字典,字符串,set集合等都是可迭代对象

        3.通过isinstance()来判断一个对象是否是迭代对象

        4.自己创建一个可容纳多个数据内容的对象是否是可迭代对象呢?
            事实证明,通过创建可容纳多个数据的对象并不是可迭代对象
            原因是在这个对象中没有取得迭代器,参考迭代器的本质

        5.可迭代对象的本质
            可迭代对象的本质就是提供了一个这样的中间人(迭代器),即迭代器为我们将这些数据遍历出来使用
            可迭代对象是通过__iter__()魔法方法取得迭代器
            同时通过__next__魔法方法指向下一个值,也就是通过这个方法把所有的数据一个一个读取出来

        6.如何自定义一个迭代器
            1.在类中添加了__iter__方法即取得迭代器,
            2.在通过__next__方法指出所有的数据,
        7.__iter__和__next__介绍
            1.__iter__:
                iter(iterable) -> iterator  传入的是一个可迭代对象,返回的是迭代器
                iter(callable, sentinel) -> iterator
                内部是从可迭代对象的__iter__方法来获得迭代器的

            2.__next__: next(iterator[, default])
                Return the next item from the iterator. If default is given and the iterator
                is exhausted, it is returned instead of raising StopIteration.
                传入一个迭代器,返回的是迭代器指向的下一个数
                内部是通过迭代器__next__方法指向下一个数据的

            3.for .. in .. 的本质:
                for item in iterable 循环的本质就是先通过iter()函数获得一个迭代器
                然后对获得迭代器不断不得调用next()方法来取得下一个值,并赋值给item
                当遇到Stopiteration的异常后循环结束

        8.迭代器的应用场景
            1.用于可迭代的对象数据
            2.因为迭代器是通过__next__来取得迭代数据的,所以也可以通过这个方法自动生成有规律的数据
            而不在使用已有的数据集取数,避免内存资源浪费
        9.注意:迭代器本身也是一个可迭代对象

        10.参考代码:
        #自己创建一个可容纳多个数据内容的对象是否是可迭代对象呢?
        # import collections
        # class func():
        #     def __init__(self):
        #         self.name = []
        #     def add(self,name):
        #         self.name.append(name)
        #
        # #创建对象
        # s1 = func()
        # s1.add("aaaa")
        # s1.add("dddd")
        # s1.add("vvvv")
        # s1.add("aaaas")
        #
        # #是否为可迭代对象:False
        # print("是否为可迭代对象:%s"%isinstance(s1,collections.Iterable))

        #自定义可迭代的类
        import collections
        class func(object):
            def __init__(self):
                self.name = []
                self.position = 0#这个是记录迭代的位置,默认从第一个开始,初始值为0
            #取得迭代器
            def __iter__(self):
                """返回一个迭代器"""
                return self
            def __next__(self):
                """返回迭代器下一个指向的值"""
                if self.position < len(self.name):#判断当前的位置是否跟总的长度相等,

                    item = self.name[self.position]
                    self.position += 1
                    return  item
                else:
                    raise StopIteration

            def add(self,name):
                self.name.append(name)

        #创建对象
        s1 = func()
        s1.add("aaaa")
        s1.add("dddd")
        s1.add("vvvv")
        s1.add("aaaas")

        #是否为可迭代对象:True
        print("是否为可迭代对象:%s"%isinstance(s1,collections.Iterable))
        #这时候遍历对象发现报错,原因是在这个类中没有写__next__方法,这个类只是有了迭代器,
        # 但并不是很完善
        for item in s1:
            print(item)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值