分享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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章