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]
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
案例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
我们会发现,调用三次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
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