zoukankan      html  css  js  c++  java
  • 迭代器与可迭代对象

    可迭代对象: 实现了__iter__协议的对象就叫可迭代对象 

    迭代器 : 继承了Iterator的类或者说实现__iter__和__next__协议的对象就叫着迭代器

    二者的关系: 使用迭代器去遍历可迭代对象 (理解起来跟java一样的)

    下面是个示例

    from collections.abc import Iterator
    
    
    # 自定义一个迭代器
    class MyIterator(Iterator):
        """继承Iterator类就是一个迭代器"""
    
        def __init__(self, employee_list):
            self.iter_list = employee_list
            self.index = 0  # 通过index维护当前索引,以便next时取下一个值
    
        def __next__(self):
            '''真正返回迭代值的逻辑'''
            try:
                employee = self.iter_list[self.index]
            except IndexError:
                raise StopIteration  # 通过这个异常结束迭代器
            self.index += 1
            return employee
    
    
    # 自定义一个可迭代对象
    class Company:
        def __init__(self, employee_list):
            self.employee_list = employee_list
    
        def __iter__(self):
            '''实现了这个方法,就是一个可迭代对象'''
            return MyIterator(self.employee_list)
    
    
    if __name__ == '__main__':
        """测试代码"""
        company = Company(['admin', 'root', 'jet'])
    
        # 使用迭代器遍历可迭代对象
        # iterator = iter(company)
        # while 1:
        #     try:
        #         print(next(iterator))
        #     except StopIteration:
        #         pass
    
        # 在python中使用迭代器遍历感觉比java low,还不如使用for in 方便, 因为ror语句内部已经帮我们处理了StopIteration异常
        # for.. in   , 发现了个快捷键  iter
    
    
        for item in company:
            print(item)
  • 相关阅读:
    js中图片base64格式转文件对象
    vue中添加百度统计代码
    一个基于vueCli3的移动端多页面脚手架
    一个基于WabPack4的 Vue 多页面原生写法脚手架
    GPU加速有坑?
    mac效率工具
    git操作详解
    高性能移动端开发
    浅析vue数据绑定
    移动端适配
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/12046264.html
Copyright © 2011-2022 走看看