一.
1.生成器
生成器的本质就是迭代器,生成器的特点和迭代器一样,取值方式和迭代器一样(_next_(),send(),给上一个yield传值),生成器一般由生成器函数或生成器表达式建成
2.生成器函数
1.普通函数没有区别,里面有yield的就是生成器函数
2.生成器函数在执行的时候,默认不会执行函数,返回生成器
3.只有通过含有这个的_next_()分段才能执行这个函数
4.send()给上一个yield传值,不能给第一个yield传值,也不能给最后一个yield传值
3.推导式
1.列表推导式[结果 for循环 条件筛选]
2.字典推导式{k:v for循环 条件筛选}
3.集合推导式{k for循环 条件筛选}
4.生成器表达式
(结果,for循环,条件)
1.惰性机制
2.只能向前
3.节省内存
生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 不找他
要. 他是不会执行的
def func(): print(111) yield 222 g = func() # 生成器g g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g g2 = (i for i in g1) # 生成器g2. 来源g1 print(list(g)) # 获取g中的数据. 这时func()才会被执行 打印111.获取到222. g完毕. print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1也就没有数据 print(list(g2)) # 和g1同理
结果 111 222 [] []
# 深坑 生成器只有在访问的时候才取值. 但一旦生成器的值被取走了,后面想要在取值就取不到了,因为值被取走了.
def add(a, b): return a + b def test(): for r_i in range(4): yield r_i g = test() for n in [2, 10]: g = (add(n, i) for i in g)#(add(n, i) for i in add(n, i) for i in g) n 都等于 10
print(list(g))
结果是 [20,21,22,23]
# 深坑 惰性机制, 不到最后不会拿值,生成器. 要值得时候才拿值.