分享python面試題中的兩道關於zip(),map()函數和匿名函數lambda的題

面試題1

題目要求:
現有兩個元組,((“a”),(“b”)),((“c”),(“d”)). 請使用python中的匿名函數生成列表[{“a”:“c”},{“b”:“d”}]

'''
做法(一)
所用的知識點:zip,lambda
'''
it = zip((("a"),("b")),(("c"),("d")))
func = lambda tup:{tup[0]:tup[1]} #匿名函數
lis = []
for i in it:
    dic = func(i)
    lis.append(dic)
print(lis)
'''
做法(二)
所用的知識點:zip、lambda、map
'''
it = zip((("a"),("b")),(("c"),("d")))
func = lambda tup:{tup[0]:tup[1]} #匿名函數
ret = map(func,it)  #map方法
print(list(ret))
'''
做法(三)
是對做法二的簡寫
'''
print(list(map(lambda tup:{tup[0]:tup[1]},zip((("a"),("b")),(("c"),("d"))))))

面試題2

題目要求:
以下代碼的輸出是什麼?給出答案並解釋。
代碼1

def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])

輸出結果:

[6, 6, 6, 6]

解析:

'''
代碼1就相當於:以下代碼:
'''
def multipliers():
    i = 3
    return [lambda x:i*x ,lambda x:i*x,lambda x:i*x,lambda x:i*x ]#返回了一個含有四個函數的列表,此時,函數都未執行

lis = []
for m in multipliers():
    ret = m(2) #m()就是其中的一個函數,此時函數才執行,這時,i經過for循環,已經是3了。
    lis.append(ret)
print(lis)

代碼2

def multipliers():
    return (lambda x:i*x for i in range(4)) #此處改爲了生成器表達式,返回一個生成器。
print([m(2) for m in multipliers()])

輸出結果

[0, 2, 4, 6]

解析:

當m(2)執行一次 纔在生成器中生成一個,所以第一次的執行m(2)的時候i=0,第二次的時候i=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章