• 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]
    '''
    

      

  • 相关阅读:
    【洛谷 2212】浇地Watering the Fields
    【洛谷 2504】聪明的猴子
    【洛谷 1991】无线通讯网
    【洛谷 3366】最小生成树_Prim
    Spark RDD中两种算子之一:常见Action算子小结
    Spark学习之路Spark之RDD
    Linux系统之pssh系列工具的使用
    MapReduce shuffle过程详解
    批量计算和流式计算
    关于IDEA破解后无法启动问题
  • 原文地址:https://www.cnblogs.com/alamZ/p/7152833.html
Copyright © 2020-2023  润新知