python 生成器

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

  

转载于:https://www.cnblogs.com/alamZ/p/7152833.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值