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

可迭代对象(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)
posted on 2019-07-21 13:30  _never  阅读(82)  评论(0编辑  收藏  举报