python 生成器
1.迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。
class MyRange(object): def __init__(self, n): self.idx = 0 self.n = n def __iter__(self): return self def next(self): if self.idx < self.n: val = self.idx self.idx += 1 return val else: raise StopIteration() if __name__ == "__main__": for i in MyRange(3): print i ''' 0 1 2 [Finished in 0.2s] '''
2.生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。
def fibonacci(num=5): a = 1 b = 1 yield a yield b while num>0: a,b=b,(a+b) yield b num -=1 if __name__ == "__main__": for i in fibonacci(): print(i) print("*")*20 f = fibonacci() while True: print(f.next()) '''
1 1 2 3 5 8 13 ******************** 1 1 2 3 5 8 13 print(f.next()) StopIteration '''
3.生成器中还有两个很重要的方法:send()和close()。close() 强制停止迭代
def MyRange(n): i = 0 while i<n: val = yield i print"val is ",val i+=1 if __name__ == "__main__": m = MyRange(5) print m.next() print m.next() print m.send("A") print m.send("B") # print m.close() print m.send("C") ''' 0 val is None 1 val is A 2 val is B 3 val is C 4 [Finished in 0.2s] '''