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

原文地址:https://www.cnblogs.com/qigege1104/p/8627892.html