一、生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样。(__next__(),send():给上一个yield传值)
生成器一般由生成器函数或者生成器表达是来创建
二、生成器函数
和普通函数没有区别。里面yield 的函数就是生成器函数
生成器函数在执行的时候,默认不会执行函数体,返回生成器
通过生成器的__next__() 分段执行这个函数
def fun():
print("aaaa")
yield 1 #返回数据
print("bbbb")
yield 2
gen = fun() #拿到生成器
gen.__next__() #执行函数,执行到下一个yield
gen.__next__() #继续执行,执行到下一个yield
send() 给上一个yield 传值,不能在开头(没有上一个yield),最后一个yield也不能用send()
def eat():
print("菜单")
a = yield "馒头"
print('a=',a)
b = yield "鸡蛋灌饼"
print('b=', b)
c = yield "手抓饼"
print('c=',c)
yield 'end'
gen =eat()
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("小米粥")
print(ret3)
ret4 = gen.send("豆腐脑")
print(ret4)
三、推导式
1.列表推导式 [结果 for循环 条件筛选]
lis = [i for i in range(10)]
print(lis)
2.字典推导式 [k:v for循环 条件筛选]
di = {"1":"aaa","2":"bbb","3":"ccc"}
dic = {j:i for i,j in di.items()}
print(dic)
3.集合推导式 {k for循环 条件}
li = [2,3,5,3,1,8,9,4,5]
se = {el for el in li}
print(se)
四、生成器表达式
(结果 for循环 条件)
特点:
1.惰性机制
2.只能向前
3.节省内存
def fun():
print(111)
yield 222
g = fun()
g1 = (i for i in g)
g2 = (j for j in g1)
print(list(g)) #111 [222]
print(list(g1)) #[]
print(list(g2)) #[]