python基础之生成器(generator)
1:创建的生成器方法1
1 >>> b=(x * 2 for x in range(10)) #创建生成器方法1 2 >>> b 3 <generator object <genexpr> at 0x0000000002FB80F8> 4 >>> next(b) 5 0 6 >>> next(b) 7 2 8 >>> next(b) 9 4 10 >>> next(b) 11 6 12 >>> next(b) 13 8 14 >>> next(b) 15 10 16 >>> next(b) 17 12 18 >>> next(b) 19 SyntaxError: unexpected indent 20 >>> next(b) 21 14 22 >>> next(b) 23 16 24 >>> next(b) 25 18
就是把想要的结果,用一个取一个
2:创建生成器方法2
1 def creatNum(): 2 print('----start-----') 3 a,b=0,1 4 for i in range(5): 5 print('-----1------') 6 yield b #只要函数里面有yield 那么这就不是一个函数了,而是一个生成器函数,程序运行到这会停,然后从停的地方继续开始 7 print('-----2------') 8 a,b = b,a+b 9 print('-----3------') 10 print('-----stop-----') 11 x = creatNum() 12 print(x) 13 print(next(x)) 14 print('='*20) 15 16 print(next(x)) 17 print('='*20) 18 19 print(next(x)) 20 print('='*20) 21 #其实next(x)可以用x.__next__()代替 22 23 24 print(next(x)) 25 print('='*20) 26 27 print(next(x)) 28 print('='*20)
运行结果:
1 <generator object creatNum at 0x0000000002193C50> 2 ----start----- 3 -----1------ 4 1 5 ==================== 6 -----2------ 7 -----3------ 8 -----1------ 9 1 10 ==================== 11 -----2------ 12 -----3------ 13 -----1------ 14 2 15 ==================== 16 -----2------ 17 -----3------ 18 -----1------ 19 3 20 ==================== 21 -----2------ 22 -----3------ 23 -----1------ 24 5 25 ====================
其中方法2创建的生成器可以用for循环迭代取出,并且这样取出的好处就是不会崩
代码示例:
1 def creatNum(): 2 print('----start-----') 3 a,b=0,1 4 for i in range(5): 5 print('-----1------') 6 yield b 7 print('-----2------') 8 a,b = b,a+b 9 print('-----3------') 10 print('-----stop-----') 11 x = creatNum() 12 print(x) 13 for num in x: 14 print(num)
运行结果:
----start----- -----1------ 1 -----2------ -----3------ -----1------ 1 -----2------ -----3------ -----1------ 2 -----2------ -----3------ -----1------ 3 -----2------ -----3------ -----1------ 5 -----2------ -----3------ -----stop-----
3:send()方法
代码示例:
1 def creatNum(): 2 print('----start-----') 3 a,b=0,1 4 for i in range(5): 5 print('-----1------') 6 temp=yield b #用temp接收yield的值 7 print(temp) 8 print('-----2------') 9 a,b = b,a+b 10 print('-----3------') 11 print('-----stop-----') 12 x = creatNum() 13 print(x) 14 x.send(None) #如果上来直接就调用传参数,程序会崩溃,解决方法一:就是先传一个None;方法二:就是先用__next__()方法调用,然后再用send()方法传参数调用 15 x.send('----send----') 16 x.send('------hah----')
运行结果:
1 <generator object creatNum at 0x0000000002153C50> 2 ----start----- 3 -----1------ 4 ----send---- 5 -----2------ 6 -----3------ 7 -----1------ 8 ------hah---- 9 -----2------ 10 -----3------ 11 -----1------
4:生成器yeild 完成多任务
示例代码:
1 def test1(): 2 while True: 3 print('------1------') 4 yield None 5 def test2(): 6 while True: 7 print('------2-------') 8 yield None 9 t1=test1() 10 t2=test2() 11 while True: 12 t1.__next__() 13 t2.__next__()
运行结果:
------1------ ------2------- ------1------ ------2------- ------1------ ------2------- ------1------ ------2------- ------1------ ------2------- ------1------ ------2------- ------1------ ------2------- ------1------ ------2------- ------1------
。
。
。
2018-03-23