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)
  • 相关阅读:
    perf + 火焰图用法 小结
    忽略多年的地理基本知识
    windows7安装docker异常:looks like something went wrong in step ‘looking for vboxmanage.exe’
    我的选择
    CSS3 width的min/max-content、fill-available以及fit-content
    Redis入门与命令汇总
    javascript中的原型详解
    Promise实现及原理
    nodejs中的垃圾回收
    javascript中的闭包
  • 原文地址:https://www.cnblogs.com/NeverYa/p/11220996.html
Copyright © 2011-2022 走看看