一,生成器
生成器实质就是迭代器。
如何获取生成器:
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()))
二,列表推导式,生成器表达式以及其他推导式:
1,列表推导式[结果 for循环 条件筛选]
1 lst = [] 2 for i in range(100): 3 if i % 2 == 0: 4 lst.append(i) 5 print(lst) 6 7 lst = [i for i in range(100) if i % 2 == 0] 8 print(lst)
2,字典推导式{k:v for循环 条件筛选}
dic = {'jj': '林俊杰', 'Jay': '周杰伦', 'Angelababy': '杨颖', 'Nikolas': '赵四'}
dic1 = {v: k for k, v in dic.items()}
print(dic1)
3,集合推导式{k for循环 条件}
1 lst = [1,1,1,3,5,9,4,4,5,8,6,2,4,4,7,9,5,1,4,8,5,41,47,7,8,5] 2 set = {el for el in lst} 3 print(set)
生成器表达式:
(结果 for循环 条件)
特点:
1,惰性机制
2,只能向前
3,节省内存(鸡蛋)
1 def func(): 2 print(111) 3 yield 222 4 g = func() 5 g1 = (i for i in g) 6 g2 = (i for i in g1) 7 print(list(g)) 8 print(list(g1)) 9 print(list(g2))
经典题型:
1 def add(a, b): 2 return a + b 3 def test(): 4 for r_i in range(10): 5 yield r_i 6 g = test() 7 8 for n in [1, 10, 10, 10, 10, 10, 10, 10]: 9 g = (add(n, i) for i in g) 10 11 print(list(g))