1,生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),send():给上一个yield传值) 生成器一般有生成器函数或者生成器表达式来创建 其实就是手写的迭代器 2,生成器函数 和普通函数没有区别,里面有yield的函数就是就是生成器函数 生成器函数在执行的时候,默认不会执行函数体,返回生成器 通过生成器的__next__()分段执行这个函数 send()给上一个yield传值,不能在开头的位置(没有上一个yield),最后一个yield也不可以用send() 3,推导式 1,列表推导式 [结果, for循环, 条件筛选] 2,字典推导式 {k:v, for循环, 条件筛选} 3,集合推导式 { k ,for循环,条件筛选] 4,生成器表达式 (结果 for循环 条件) 特点: 1,惰性机制 2,只能向前 3,节省内存
1,
def func(): print(111) yield 222 yield 333 g = func() #获取生成器 g1 = (i for i in g) #生成器 g2 = (i for i in g1) #生成器 print(list(g2)) # 111 [222,333] 源头,从源头把数据拿走了 print(list(g1)) # [] 这里执行的时候,源头已经没有数据
2,很坑的面试题 def add(a,b): #求和 return a+b def test(): #生成器函数 0,1,2,3 for i in range(4): yield i g = test() #获取生成器 for n in [2,10]: #到最后才放数据(惰性) g = (add(10,i)for i in g)
#此时的g是一个生成器,实际上内部并没有被执行
相当于以下代码:
n = 10
g = (add(n, i) for i in g)
g = (add(n, i) for i in g)
print(list(g)) # [20, 21, 22, 23] 此时才会动生成器