python学习——生成器表达式

深坑:生成器要值的时候才会拿

 

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))

原文地址:https://www.cnblogs.com/bilx/p/11327675.html