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))  #[]