生成器面试题

生成器的特点,只能往后执行并只能取一边。

def demo():
    for i in range(8):
        yield i
g = demo()
g1 = (i for i in g)
g2 = (i for i in g1)
print(list(g1))
print(list(g2))#g2打印出来为空,因为g1在第一取值时向g去遍历,并把值全部打印出来。当g2取值时,会向上找g要。但是g1已经把g取空了 .故为空,若是想要为不为空需要注释掉g1.
View Code

def add(n,i):
    return n + i
def text():
    for i in range(5):
        yield i
g = text()
for n in [1,10]:
    g = (add(n,i)for i in g)
print(list(g))
View Code

分析:

  1.add函数生成1~10个数:

  2.text生成器遍历一个0~4的列表。

  3.因为g是使用的生成器表达式,所以一直到最后调用时函数才开始执行。因为生成器的原因,一次只能去一个值,且只能保存一个值。当n=10时,此时g等于从10分别加上[1,5]构成一个新的列表[10,11,12,13,14].新的列表再与10进行for遍历相加,最后强制转换并输出。

在for循环套生成器的情况

将for循环拆解。例如:如果把上面的for循环改为[1,4,2]。

我可以用拆成下面这样:

n = 1
g = (add(n, i) for i in g)
n = 4
g = (add(n, i) for i in g)
n = 2
g = (add(n, i) for i in(add(n,i)for i in(add(n,i)for i in text())
View Code

因为生成器的原因,你最后就只剩下2了,最后我们打印的就是最后行代码。如此就很清晰了。

原文地址:https://www.cnblogs.com/zly9527/p/11392953.html