面试题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