一、生成器
生成器实质就是迭代器
获取生成器的方式:
1.通过生成器函数
2.通过推导式实现生成器
3.通过数据转换实现生成器
获取生成器函数 __next__():
1 def func(): 2 print('假装我是一个功能') 3 yield '然而并不是' 4 print('假装我是小蝌蚪') 5 yield '你看不见我' 6 print('假装我是一阵风') 7 yield '无影无形' 8 9 s = func() 10 print(s.__next__()) 11 print(s.__next__()) 12 print(s.__next__())
节省内存的方法:
1 def eggs(): 2 i = 1 3 while i < 101: 4 yield '鸡蛋%s' % i 5 i += 1 6 s = eggs() 7 print(s.__next__()) 8 print(s.__next__()) 9 print(s.__next__()) 10 print(s.__next__())
获取生成器函数 send():
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)
列表推导式:
[结果 for 变量 in 可迭代对象 if 条件]
1 # 获取1-100内能被3整除的数 2 lst = [i for i in range(1,101) if i % 3 == 0] 3 print(lst)
1 # 寻找名字中带有两个e的人的名字 2 names = [['Tom', 'Billy', 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' ,'Joe'],['Alice', 'Jill' , 'Ana', 'Wendy', 'Jennifer', 'Sherry' , 'Eva']] 3 lst = [a for i in names for a in i if a.count('e') == 2] 4 print(lst)
字典推导式:
{结果 for 变量 in 可迭代对象 if 条件} 结果是键值对=》key:value
1 # 字典推导式 2 3 list1 = ['假', '装', '我', '是', '一', '阵', '风'] 4 list2 = ['你','看','我','是','6','个', '字'] 5 6 dic = {list1[i]:list2[i] for i in range(len(list1))} 7 print(dic)
集合推导式:
{结果 for 变量 in 可迭代对象 if 条件} 结果是 key
1 lst = [1, -1, 8, -8, 12] 2 # 绝对值去重 3 s = {abs(i) for i in lst} 4 print(s)
生成器表达式和列表推导式的区别:
1.列表推导式比较耗内存. 一次性加载. 生成器表达式几乎不占用内存. 使用的时候才分 配和使用内存
2.得到的值不一样. 列表推导式得到的是一个列表. 生成器表达式获取的是一个生成器