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 \n [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] 此时才会动生成器