1、匿名函数的引入
2、匿名函数的定义
3、有关面试题
1)下面程序输出的结果是?
1 d = lambda p:p*2 2 t = lambda p:p*3 3 x = 2 4 x = d(x) 5 x = t(x) 6 x = d(x) 7 print(x) 8 # # todo:但是x的值是在变化的, 9 # # 从x=2 ---> x = d(x) = x*3 = 6 ---> x = t(x) = x*2 = 12 --> x = d(x) = x*2 = 24 10 # ''' 11 # 答:4,(看最后一次的赋值:x = d(x) )
2)有两个元组(('a'),('b')),(('c'),('d')),请使用python中的匿名函数生成列表[{'a':'c'},{'b':'d'}] 出题很有水平
1 t1 = (('a'),('b')) 2 t2 = (('c'),('d')) 3 # #法1 4 zi = lambda a, b: zip(a, b) 5 #it = zip(t1,t2) 6 res = {} 7 for i in zi(t1, t2): 8 res[i[0]] = i[1] 9 # 10 #法2 优化代码后 todo:考到匿名函数时,就要想到内置函数, 11 # todo 有5个内置函数(map,filter,sorted,min,max)是可以用到匿名函数的! 12 it = zip(t1,t2) 13 res = map(lambda tup:{tup[0]:tup[1]},it) 14 print(list(res))
3)以下代码的输出是什么?请给出答案并解释。
1 def multipliers(): 2 return [lambda x:i*x for i in range(4)] 3 print([m(2) for m in multipliers()]) 4 # 请修改multipliers的定义来产生期望的结果。 5 '''错误示范 6 答:输出的结果是一个生成器对象,因为最有打印的是一个生成器表达式,它的返回结果是一个生成器; 7 要想产生期望的结果,需要迭代它: 8 for i in [m(2) for m in multipliers()]: 9 print(i) 10 结果为: 11 0 12 2 13 4 14 6 15 ''' 16 # for i in [m(2) for m in multipliers()]: 17 # print(i) 18 #todo 做错分析:生成器表达式是用‘()’包起来的!而此处是‘[]’,明显是列表推导式!---> 它是生成列表的 19 # todo 这个生成的列表,[lambda x:i*x for i in range(4)] 20 # todo:解析成普通表达式:此时没有执行(没有赋值,非赖加载),而i都取出来,最后的i = 3 21 lis = [] 22 for i in range(4): 23 lis.append(lambda x:i*x) # todo 赖加载,i没有被赋值 24 print(lis) # [<function <lambda> at 0x000001A4FF45E400>, <function <lambda> at 0x000001A4FF45E840>, <function <lambda> at 0x000001A4FF45E6A8>, <function <lambda> at 0x000001A4FF45E730>] 25 # 错误的理解:里面的元素是4个匿名函数:lambda x:0*x,lambda x:1*x,lambda x:2*x,lambda x:3*x 26 # todo 接着打印这个列表:[m(2) for m in multipliers()] 27 # todo:将这个列表推导式解析为普通列表: 28 li = [] 29 for m in multipliers(): 30 li.append(m(2)) 31 print(li)#[6, 6, 6, 6] 32 33 # --todo 题目最后要产生期望的结果。即上面“错误的理解”,以为是生成器 34 def multipliers_n(): 35 return (lambda x:i*x for i in range(4)) 36 print([m(2) for m in multipliers_n()]) # 这里每循环一次,就执行一次生成器去取值,这才是真正的赖加载