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

      迭代:一次迭代就是一次对过程的重复,并且每次迭代的结果都将作为下一次迭代的初始值.

    可迭代对象(iterable)
    标志:__iter__(),返回值是迭代器.
    作用:可以参与for
    迭代器(iterator)
        标志:__next__(),返回值是聚合对象的元素
    作用:可以迭代(挨个取元素)

    1.for循环原理

    iterable = [1, 2, 3, 4]
    iterator = iterable.__iter__()
    while True:
        try:
            item = iterator.__next__()
            print(item)
        except StopIteration:
            break

    首先,调用可迭代对象的__iter__方法,得到一个迭代器对象;
    接着,在死循环while True中调用迭代器对象的__next__方法,以迭代的方式依次得到迭代器中的元素.
    最后,当执行__next__方法的时候抛出异常了,终止循环.

    2.__iter__方法和__next__方法的具体实现

    # 1. 创建拥有__iter__方法的可迭代对象
    class SkillManager:
        def __init__(self):
            self.__list_skill = []
    
        def add_skill(self, skill):
            self.__list_skill.append(skill)
    
        def __iter__(self):
            return  SkillIterator(self.__list_skill)
    
    # 2. 创建自定义迭代器
    class SkillIterator:
        def __init__(self, list_target):
            self.__list_target = list_target
            self.__index = -1  
    
        def __next__(self):
            if self.__index < len(self.__list_target) - 1:
                self.__index += 1
                return self.__list_target[self.__index]
            else:
                raise StopIteration     # for循环实际调用__next__方法时,是在一个死循环中,我们采用抛出异常的方法来终止死循环
    
    # 使用for循环一次得到可迭代对象中的元素
    iterable = SkillManager()
    iterable.add_skill("九阳神功")
    iterable.add_skill("乾坤大挪移")
    iterable.add_skill("九阴白骨爪")
    for item in iterable:
        print(item)
  • 相关阅读:
    scrapy的自动限速(AutoThrottle)扩展
    js可以控制文件上传的速度吗?
    用DataReader 分页与几种传统的分页方法的比较
    jdbc分页查询
    几种分页方式分析.
    mybatis下的分页,支持所有的数据库
    java 物理分页和逻辑分页
    IBatis的分页研究
    JDBC分页
    用Java实现异构数据库的高效通用分页查询功能
  • 原文地址:https://www.cnblogs.com/NeverYa/p/11220996.html
Copyright © 2011-2022 走看看