pytion3--用户定义的迭代器
1、迭代器基于下面两个个方法:
(1)__next__ 返回容器的下一个项目
(2)__iter__ 返回迭代器本身
2、当序列遍历完时,将抛出StopIteration异常,所以通过捕获这个异常来停止循环
下面是自定义迭代器的示例代码:
class MyIterator(object): def __init__(self, step): self.step = step def __next__(self): if self.step == 0: raise StopIteration self.step -= 1 return self.step def __iter__(self): return self for i in MyIterator(6): print(i)
运行结果:
5 4 3 2 1 0
用户定义的迭代器
如今,Python中所有的迭代坏境都会先尝试__iter_二方法,再尝试__getite。_。也就是说,它们宁愿使角第13章所学到的迭代协议,然后才是重复对对象进行索弓l运算。如果对象不支持迭代协议,就会尝试索引运算。从技术角度来讲,迭代环境是通过调用内置函数iter去尝试寻找iter方法来实现的,而这种方法应该返回一个迭代器对象。如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生stop工teration异常。如果没找到这类__iter__方法,Python会改用__getitem__机制,就像之前那样通过偏移量重复索引,直到引发
IndexError异常。
下面的文件iters.py定义了用户定义的迭代器类来生成平方值。
#!/usr/bin/env python # -*- coding:utf-8 -*- class Squares: def __init__(self, start, stop): self.value = start - 1 self.stop = stop def __iter__(self): return self def __next__(self): if self.value == self.stop: raise StopIteration self.value += 1 return self.value **2 for i in Squares(1, 5): print(i)
运行结果:
1 4 9 16 25
# 用生成器函数编写
#!/usr/bin/env python # -*- coding:utf-8 -*- # 用生成器函数编写 def gsquares(start, stop): for i in range(start, stop+1): yield i ** 2 for i in gsquares(1, 5): print(i, end=" ")
运行结果:
1 4 9 16 25