一,生成器
生成器实质就是迭代器。
如何获取生成器:
1,通过生成器函数
2,通过各种推导式来实现生成器
3,通过数据的转换也可以获取生成器
函数:
1 def order(): 2 lst = [] 3 for i in range(10000): 4 lst.append('衣服'+str(i)) 5 return lst 6 ll = order()
生成器函数:
1 def order(): 2 for i in range(10000): 3 yield '衣服'+str(i) 4 g = order() 5 wanghua = g.__next__() 6 print(wanghua) 7 zhangyining = g.__next__() 8 print(zhangyining)
区别:第一种是一次性全部拿出来,会很占用内存。第二种使用生成器。一次性只取一个,用多少取多少。生成器是一个一个的指向下一个。不会回去,__next__()到哪,指针就指到哪儿。下一次继续获取指针指向的值。
send()和__next__()都可以让生成器执行到下一个yield.
1 def eat(): 2 print('我吃啥?') 3 a = yield '包子' 4 print('a=', a) 5 b = yield '馅饼' 6 print('b=', b) 7 c = yield '牛肉汉堡' 8 print('c=', c) 9 yield 'GAME OVER' 10 gen = eat() 11 ret1 = gen.__next__() 12 print(ret1) 13 ret2 = gen.send('酸菜汤') 14 print(ret2) 15 ret3 = gen.send('羊肉') 16 print(ret3) 17 ret4 = gen.send('鸡肉卷') 18 print(ret4)
send()和__next__()区别:
1,send和next都是生成器向下走一次
2,send可以给上一个yield的位置传递值,不能给最后一个yield发送值。在第一次执行生成器代码的时候不能使用send()
1 def func(): 2 yield 1 3 yield 5 4 yield 24 5 yield 55 6 yield 56 7 yield 78 8 func() 9 for i in func(): 10 print(i) 11 print(list(func()))
二,列表推导式,生成器表达式以及其他推导式: