python生成器笔记

一、什么是生成器

  通过列表解析生成的一个列表,当数据量过大的时候,很占内存。因此有了生成器这个算法,能够很好地节省内存

    列表解析例子:[i for i in range(5)]

    生成器例子   :(i for i in range(5))

二、生成器的使用

  1.直接使用

    案例1

 1 t1 = (i for i in range(5))
 2 t2 = (i * i for i in range(5))
 3 t3 = (i * i for i in range(5) if i % 2 == 0)
 4 
 5 g1 = list(t1)
 6 g2 = list(t2)
 7 g3 = list(t3)
 8 
 9 print(t1)
10 print(t2)
11 print(t3)
12 
13 print(g1)
14 print(g2)
15 print(g3)
<generator object <genexpr> at 0x000002B159172AF0>
<generator object <genexpr> at 0x000002B159377F10>
<generator object <genexpr> at 0x000002B1593AA570>
[0, 1, 2, 3, 4]
[0, 1, 4, 9, 16]
[0, 4, 16]
out1

  2.使用yield生成生成器(next调用函数遇到yield则返回)

    案例2

      普通函数

1 def step():
2     print('step 1')
3     print('step 1')
4     print('step 2')
5     return None
6 
7 a = step()
8 print(a)
step 1
step 1
step 2
None
out2

    案例3

      使用yield的函数-1

 1 def step():
 2     print('step 1')
 3     yield 1
 4     print('step 1')
 5     yield 2
 6     print('step 2')
 7     yield 3
 8 
 9 a = next(step())
10 print(a)
11 b = next(step())
12 print(b)
13 c = next(step())
14 print(c)
step 1
1
step 1
1
step 1
1
out3

我们会发现,调用三次step()函数都是执行yield1跳出,这是因为没从通过next调用,会被认为不是同一个函数

解决方案是:

     案例4

      使用yield函数-2

 1 def step():
 2     print('step 1')
 3     yield 1
 4     print('step 1')
 5     yield 2
 6     print('step 2')
 7     yield 3
 8 
 9 g = step()
10 a = next(g)
11 print(a)
12 b = next(g)
13 print(b)
14 c = next(g)
15 print(c)
step 1
1
step 1
2
step 2
3
out3

  3.在for循环中使用

    案例5

 1 def fib(x):
 2     n,a,b = 0,0,1
 3     while n < x:
 4         yield b
 5         a,b = b,a+b
 6         n += 1
 7     return 'Done'
 8 
 9 a = fib(5)
10 print(a)
11 for i in range(5):
12     r = next(a)
13     print(r)
<generator object fib at 0x0000022F2F416620>
1
1
2
3
5
out4
posted @ 2018-08-29 14:24  AdriftCore  阅读(138)  评论(0编辑  收藏  举报