分享python面试题中的两道关于生成器表达式的题

面试题1

def demo():
    for i in range(4):
        yield i

g=demo()
g1=(i for i in g)#此时并不执行for循环,只是生成一个生成器
'''
上句代码相当于:
def func():
    for i in g:
        yield i
g1 = func()
'''
g2=(i for i in g1) #生成器表达式  返回的是一个生成器,表达式里的代码不执行
'''
执行过程就是,list找g1要全部的值,g1通过for循环找g一个一个的要值
'''
print(list(g1))#执行这行代码的时候,list把g1中所有的值都要走了
print(list(g2))#list找g2要值,g2找g1要值,但是g1把所以的值给了前一个list了,所以就没值可给了

运行结果:

[0, 1, 2, 3]
[]

面试题2

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g = test()

for n in [1,10]:#所有for循环里套生成器表达式的,要把for循环拆开来算,不容易晕
    g=(add(n,i) for i in g)
'''
上两句代码相当于:
n = 1
g = (add(n,i) for i in g) #生成器表达式  返回的是一个生成器,表达式里的代码不执行
n = 10          #此后代码的n值都为10
g = (add(n,i) for i in g)  
———> g = (add(10,i) for i in (add(10,i) for i in g)) 
———> g = (add(10,i) for i in (add(10,i) for i in test())) 
———> g = (add(10,i) for i in (add(10,i)) for i in (0,1,2,3))
———> g = (add(10,i) for i in (add(10,i)) for i in (0,1,2,3))
———> g = (add(10,i) for i in (10,11,12,13))
———> g = (20,21,22,23)
'''
print(list(g))#list 找 g要值,然后g找上一个g要值,上一个g找test要值
'''
执行list(g)的时候,前面的生成器表达式才工作,此时n已经为10了,所以,所有的生成器表达式里的值都要用n=10来计算
'''

运行结果:

[20, 21, 22, 23]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章