深坑:生成器要值的时候才会拿
tu = (i for i in range(10)) #没有元组推导式,只有生成器表达式
print(tu)
print(tu.__next__())
=============================================
推导式和生成器的区别示例
lst = [i for i in range(10) ] #列表
print(lst)
gen = (i for i in range(10)) #生成器,惰性机制*
print(gen.__next__())
==================================
生成器函数
def func():
print(111)
yield 222
yield 333
++++++++++++++++++++++
第一种情况
g = func() #获取生成器
g1 = (i for i in g) #生成器
g2 = (i for i in g1) #生成器
print(list(g)) #打印的是[222,333],源头,从源头把数据拿走了
print(list(g1)) #打印的是[ ],这里执行的时候,源头已经没有数据了
print(lsint(g2)) #打印的是[ ],如果把这个print放到前两个print之前,那么222,333在这个print对应的跟g2中,g、g1为[ ]
++++++++++++++++++++++++++++
第二种情况
g = func() #获取生成器
g1 = (i for i in g) #生成器
g3 = func() #获取生成器
g2 = (i for i in g3) #生成器
print(list(g)) #打印的是[222,333],源头,从源头把数据拿走了
print(list(g1)) #打印的是[ ],这里执行的时候,源头已经没有数据了
print(lsint(g2)) #打印为[222,333],因为g3 跟g是两个没有关系的生成器,所以有值
===============================================================
#求和
def add(a,b):
return a+b
#生成器函数,返回的结果为0~3
def test():
for r_i in range(4): #0,1,2,3
yield r_i
g = test() #0,1,2,3
@n = 2 #n = 2此时没有从生成器中拿值,
@g = (add(n,i) for i in g)
@n = 10 #n = 10 时因为
@g = (add(n,i) for i in (add(n,i) for i in g))
#惰性机制
###for n in [2,10]: #将带###的2句,直译为带@的4句中的两次遍历
###g = (add(n,i) for i in g) #这里虽然遍历了两次[2,10]列表,但是只有遍历的过程,没有计算,最后一次遍历的时候要求打印list(g),由于惰性机制只有在要求计算结果的时候n=10,才会从生成器中取值g=(0,1,2,3)然后带入多次循环语句g = (add(n,i) for i in (add(n,i) for i in g))中,按照n=10这一要求计算之前n的取值结果,自后先前依次计算。
print(list(g))