3.3.4 lambda 表达式


  lambda表达式常用来声明匿名函数,即没有函数名字的临时使用的小函数,例如第2章中列表对象的sort()方法以及内置函数sorted()中key参数。lambda表达式只可以包含一个表达式,不允许包含其他复杂的语句,但在表达式中可以调用其他函数,并支持默认值参数和关键字参数,该表达式的计算结果相当于函数的返回值。下面的代码演示了不同情况下lambda表达式的应用。

 1 >>> f = lambda x,y,z:x+y+z
 2 >>> print(f(1,2,3))                    #把lambda表达式当做函数使用
 3 6
 4 >>> 
 5 >>> g = lambda x,y = 2,z=3:x + y + z   #含有默认值参数
 6 >>> print(g(1))
 7 6
 8 >>> 
 9 >>> 
10 >>> print(g(2,z=4,y=5))                #使用关键字参数
11 11
12 >>> 
13 >>> l = [(lambda x:x**2),(lambda x:x**3),(lambda x:x**4)]
14 >>> print(l[0](2),l[1](2),l[2](2))
15 4 8 16
16 >>> 
17 >>> d = {'f1':(lambda :2+3),'f2':(lambda :2*3),'f3':(lambda :2**3)}
18 >>> 
19 >>> print(d['f1'](),d['f2'](),d['f3']())
20 5 6 8
21 >>> 
22 >>> l = [1,2,3,4,5]
23 >>> print(map((lambda x:x+10),l))
24 <map object at 0x00000000037E5198>
25 >>> #没有名字的lambda表达式,作为函数参数
26 >>> 
27 >>> 
28 >>> def demo(n):
29     return n*n
30 
31 >>> demo(5)
32 25
33 >>> 
34 >>> al = [1,2,3,4,5]
35 >>> list(map(lambda x:demo(x),al))    #在lambda表达式中调用函数
36 [1, 4, 9, 16, 25]
37 >>> 
38 >>> 
39 >>> data = list(range(20))
40 >>> print(data)
41 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
42 >>> 
43 >>> import random
44 >>> random.shuffle(data)
45 >>> data
46 [12, 11, 18, 7, 14, 5, 0, 8, 3, 2, 9, 1, 17, 6, 19, 13, 4, 10, 15, 16]
47 >>> 
48 >>> 
49 >>> data.sort(key=lambda x:x)        #用在列表的sort()方法中,作为函数参数
50 >>> 
51 >>> data
52 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
53 >>> 
54 >>> data.sort(key=lambda x:len(str(x)),reverse=True)
55 >>> data
56 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
57 >>> 
58 >>> 

  注意:在使用lambda表达式是,要注意变量作用域可能会带来的问题,例如,下面的代码中变量x是在外部作用域中定义的,对lambda表达式而言不是局部变量,从而导致出现了错误。

 1 >>> r = []
 2 >>> for x in range(10):
 3     r.append(lambda :x**2)
 4 
 5     
 6 >>> r
 7 [<function <lambda> at 0x00000000037E8F28>, <function <lambda> at 0x00000000037E9048>, <function <lambda> at 0x00000000037E9268>, 
<function <lambda> at 0x00000000037E92F0>, <function <lambda> at 0x00000000037E9378>, <function <lambda> at 0x00000000037E9400>,
<function <lambda> at 0x00000000037E9488>, <function <lambda> at 0x00000000037E9510>, <function <lambda> at 0x00000000037E9598>,
<function <lambda> at 0x00000000037E9620>] 8 >>> 9 >>> 10 >>> r[0]() 11 81 12 >>> 13 >>> r[1]() 14 81 15 >>>

  而修改为下面的代码,可以得到正确的结果。

 1 >>> r = []
 2 >>> for x in range(10):
 3     r.append(lambda n=x:n**2)
 4 
 5     
 6 >>> r[0]()
 7 0
 8 >>> 
 9 >>> r[1]()
10 1
11 >>> 
12 >>> r[9]()
13 81
14 >>> 

优质内容筛选与推荐>>
1、linux重启后JDk环境变量配置失效最终解决方案
2、win7打印机共享怎么设置
3、C# 数字格式字符串
4、DIV CSS布局的几点建议
5、洛谷P2680 运输计划 树上差分 LCA 倍增 tarjan


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn