python 生成器、生成器函数、推导式、生成器表达式
一、生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样。(__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)) #[]