迭代器的定义与自定义一个迭代器

迭代器

1,如何让一个对象成为一个可以迭代的对象?

  • 该对象的内部需要实现 __iter__方法
  • 代码示例:
    from collections import Iterable, Iterator
    class Groups(object):
        def __init__(self):
            self.names = []
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            pass
    
    
    class GroupIterator(object):
        def __iter__(self):
            pass
    
        def __next__(self):
            return 11
    
    
    group = Groups()
    group.add("老王")
    group.add("老张")
    group.add("老李")
    
    if isinstance(group, Iterable):
        print("这是一个可以迭代的对象")
    
    if isinstance(GroupIterator(), Iterator):
        print("这是一个迭代器")
    

2, 什么是迭代器?

  • 迭代器需要满足两个条件
    • 内部实现__iter__方法
    • 内部实现__next__方法

3,自定义一个迭代器

  • 根据以上知识点自定义一个迭代器
    from collections import Iterable, Iterator
    
    
    class Groups(object):
        def __init__(self):
            self.names = []
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            return GroupIterator(self)
    
    
    class GroupIterator(object):
        def __init__(self, obj):
            self.obj = obj
            self.num = 0
    
        def __iter__(self):
            pass
    
        def __next__(self):
            if self.num < len(self.obj.names):
                ret = self.obj.names[self.num]
                self.num += 1
                return ret
    
            else:
                # 抛出异常,终止迭代
                raise StopIteration
    
    
    group = Groups()
    group.add("老王")
    group.add("老张")
    group.add("老李")
    
    if isinstance(group, Iterable):
        print("这是一个可以迭代的对象")
    
    if isinstance(GroupIterator(group.names), Iterator):
        print("这是一个迭代器")
    
    for name in group:
        print(name)
    
    

4,完善迭代器

  • 代码示例:
    from collections import Iterable, Iterator
    
    
    class Groups(object):
        def __init__(self):
            self.names = []
            self.num = 0
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.num < len(self.names):
                ret = self.names[self.num]
                self.num += 1
                return ret
    
            else:
                # 抛出异常,终止迭代
                raise StopIteration
    
    
    group = Groups()
    group.add("老王")
    group.add("老张")
    group.add("老李")
    
    for name in group:
        print(name)
    

5, 总结

  • 可迭代对象
    • 实现__iter__方法
  • 迭代器
    • 实现__iter__方法和__next__方法
  • 一个对象时一个迭代器,那么他一定可以迭代,但是一个对象可以迭代,不一定是一个迭代器,比如for循环
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值