迭代:一次迭代就是一次对过程的重复,并且每次迭代的结果都将作为下一次迭代的初始值.
可迭代对象(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)