• 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 >>> 
  • 相关阅读:
    python类变量与成员变量,及模块中类变量共享
    python制作GUI界面---搞定软件界面编程
    pycharm运行PyQt5出现错误This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
    pycharm安装包下载慢的问题解决
    DNS隧道实验
    关于虚拟机win Server 2003只能打开百度网页其他网页都打不开??
    Python如何将决策树dot文件转化为png文件
    如何将虚拟机win7成功联网
    关于虚拟机win2003忘记登录密码(待解决)
    虚拟机kali忘记密码后问题解决&&kali用桥接模式成功联网
  • 原文地址:https://www.cnblogs.com/avention/p/8615035.html
Copyright © 2020-2023  润新知