Python进阶-Ⅷ 匿名函数 lambda

1、匿名函数的引入

为了解决那些功能很简单的需求而设计的一句话函数
1 def func(i):
2     return 2*i
3 # 简化之后
4 func = lambda i:2*i #todo 其中:func是函数名,lambda是匿名函数的关键字,i是传入的参数,2*i是返回值。
5 print(func(2))

 

2、匿名函数的格式

函数名 = lambda 参数 :返回值

参数可以有多个,用逗号隔开
匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
返回值和正常的函数一样可以是任意数据类型
我们可以看出,匿名函数并不是真的不能有名字。
匿名函数的调用和正常的调用也没有什么分别。 就是 函数名(参数) 就可以了~~~

3、特殊使用方式
 1 # 1) 返回语句是简单的三元运算
 2 num = [1,2,6,7,9]
 3 filter(lambda x:True if x%2 == 0 else False, num)
 4 
 5 # 2) 返回的是一个列表推导式
 6 nums = [[1,2],[6,7],[9,10]]
 7 g = filter(lambda x:['ILOVEU%d'%i for i in x], nums)
 8 for i in g:
 9     for j in i:
10         print(j)  #--todo 未返回字符串!

 

4、有关面试题

    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()]) # 这里每循环一次,就执行一次生成器去取值,这才是真正的赖加载
posted @ 2019-12-01 19:17  四方游览  阅读(474)  评论(0)    收藏  举报