迭代器(高级)

迭代器(高级)

  • 什么是迭代器
    由iter(x)函数返回,可以通过next(it)函数取值的对象就是迭代器

  • 迭代器协议:
    迭代器协议是指对象能够使用next()函数获取下一项数据,没有下一项数据时触发一个StopIteration异常来终止迭代的约定

  • 迭代器协议的实现方法:
      def next(self):
    ….

  • 注:此方法需要实现迭代器协议

  • 什么是可迭代对象:
    是指能用iter(obj)函数返回迭代器的对象(实例)
    可迭代对象内部要定义__iter__(self)方法来返回迭代器对象

# 此示例示意将自定义的类创建的对象制作成为可迭代对象
class Mylist():
    '''这是一个自定义的列表类型,此类型的对象是
    用data属性绑定的列表来存储数据'''
    def __init__(self, iterable=()):
        self.data = [x for x in iterable]

    def __repr__(self):
        return 'Mylist(%s)' % self.data


# myl = Mylist([2, 3, 5, 7])
# for x in myl:
#     print(x)  # 报错,这个不是可迭代对象
# TypeError: 'Mylist' object is not iterable
print('--------修改为----------------------------')


class Mylist():
    '''这是一个自定义的列表类型,此类型的对象是
    用data属性绑定的列表来存储数据'''
    def __init__(self, iterable=()):
        self.data = [x for x in iterable]

    def __repr__(self):
        return 'Mylist(%s)' % self.data

    def __iter__(self):
        '''此方法用于返回一个能访问self对象的迭代器'''
        print('__iter__() 方法被调用')  # 调试用, 此方法仅会被一次用
        return MylistIterator(self.data)


class MylistIterator:
    '''写一个类,专门用来描述能够访问Mylist类型对象的迭代器'''
    def __init__(self, lst):
        self.data_lst = lst
        self.cur_index = 0  # 迭代器访问的其实位置

    def __next__(self):
        '''此方法用来实现迭代器协议'''
        if self.cur_index >= len(self.data_lst):
            raise StopIteration
        r = self.data_lst[self.cur_index]
        self.cur_index += 1
        return r


myl = Mylist([2, 3, 5, 7])
it = iter(myl)  # 等同于调用 it  = myl.__iter__()
print(next(it))  # 2
print(next(it))  # 3

for x in myl:
    print(x)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值