1.生成器
def func():
print("111")
yield 222
print("333")
yield 444
print(func())
1 def func(): 2 print("111") 3 yield 222 4 ret=func() 5 res=ret.__next__() 6 7 print(res)
这里ret=fun 不会执行函数,拿到的是生成器 有了生成器才可以进行下一个
1 def cloth(): 2 for i in range(0,10000): 3 yield "衣服"+str(i) 4 cl=cloth() 5 print(cl.__next__()) 6 print(cl.__next__()) 7 print(cl.__next__())
这里为什么要用到生成器呢 以为他的惰性 如果一次性出了全部的数字,那么多的内存会没有地方反而占用更大空间
由于和迭代器一样的属性,用一个出一个才会是最完美的方法
2.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 "gameover" 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 发送值,在第一次执行生成器代码的时候不能使用seng()
3.生成器可以使用for 循环来获取内部元素
1 def func(): 2 print(111) 3 yield 222 4 print(333) 5 yield 444 6 print(555) 7 yield 666 8 gen = func() 9 for i in gen: 10 print(i)
2.列表推导式
一句话 生成一个列表
语法:[ 结果 for 循环 ]
1 lst=[i for i in range(1,15)] 2 print(lst)
生成器表达式
1 gen=(i for i in range(15)) 2 print(gen)
生成器表达式和列表推导式的语法基本上一样的,只是把[]换成{}
区别:
1.列表推导式比较耗内存,一次加载,生成器表达式几乎不占用内存,
2.得到的值不一样,生成器只有在访问的时候才取值,说白了,你找他要他才给你值,不找他要,是不会执行的