zoukankan      html  css  js  c++  java
  • 『Python基础-14』匿名函数 `lambda`

    匿名函数和关键字lambda

    • 匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数
    • 在Python中,如果要声匿名函数,则需要使用lambda关键字
    • 使用lambda声明的匿名函数能接收任何数量的参数,但只能返回一个表达式的值。
    • 匿名函数不能直接调用priht(),因为lambda需要一个表达式。
    • 匿名函数的用处:
      • 当我们要对两个数进行运算,如果希望声明的函数支持所有的运算,可以将匿名函数作为函数参数传递。
      • 匿名函数还通常作为内置函数的参数来使用

    匿名函数lambda和普通函数def的区别

    1. def创建的函数是有名称的,而lambda没有函数名称,这是最明显的区别之一。
    2. lambda返回的结果通常是一个对象或者一个表达式,它不会将结果赋给一个变量,而def可以。
    3. lambda只是一个表达式,函数体比def简单很多,而def是一个语句。
    4. lambda表达式的冒号后面只能有一个表达式,def则可以有多个.
    5. 像if或for等语句不能用于lambda中, def则可以。
    6. lambda一般用来定义简单的函数,而def可以定义复杂的函数。
    7. lambda函数不能共享给别的程序调用,def可以。

    为什么要用到匿名函数lambda?

    因为简单 、简洁,它能很快的写函数,非常适用于小型函数,能在一行命令将函数表达完整。

    申明lamnda的格式:

    lambda 变量1,变量2,···变量n :运算表达式
    

    例一:

    # 定义一个计算三数相加的匿名函数
    f=lambda x,y,z : x+y+y   # x,y,z表示匿名函数的参数; x+y+z表示的返回的结果
    f(1,2,3)   # 执行匿名函数
    
    

    例二:

    # 通过匿名函数判断数字是否是偶数
    is_num = lambda num: True if num % 2 == 0 else False
    
    # 执行匿名函数
    result = is_num(1)
    print(result)
    

    匿名函数的应用

    应用一: 作为函数的参数传递

    • 示例(1):匿名函数作自定义函数的参数
    #定义函数
    def myFunc(num1,num2,option):
        print('num1 = %d'%num1)
        print('num2 = %d'%num2)
        print('num1 + num2 = %d'%option(num1,num2))
    #调用函数
    myFunc(3,5,lambda x,y:x+y)
    

    上述代码运行结果:

    num1 = 3
    num2 = 5
    num1 + num2 = 8
    
    • 示例(2): 作为内置函数的参数
    #定义一个列表,列表中的元素是字典
    stus = [{'name':'xiaoming','age':18},
            {'name':'xiaohong','age':19},
            {'name':'xiaoxue','age':17}]
    #实现列表中的元素按name排序
    stus.sort(key = lambda x:x['name'])
    print('列表中的元素按name排序:', stus)
    #实现列表中的元素按age排序
    stus.sort(key = lambda x:x['age'])
    print('列表中的元素按age排序:', stus)
    

    上述代码运行结果:

    列表中的元素按name排序: [{'name': 'xiaohong', 'age': 19}, {'name': 'xiaoming', 'age': 18}, {'name': 'xiaoxue', 'age': 17}]
    列表中的元素按age排序: [{'name': 'xiaoxue', 'age': 17}, {'name': 'xiaoming', 'age': 18}, {'name': 'xiaohong', 'age': 19}]
    
    • 示例(3): 匿名函数和普通函数都是函数,都是可以作为函数的参数使用的
    # 使用一个变量sum保存sum_num函数的内存地址
    sum = sum_num
    # 执行函数
    result = sum(1, 2)
    print(result)
    
    def calc(num1, num2, func_name):
        result = func_name(num1, num2)
        print("func_name:", id(func_name))
        return result
    
    # 匿名函数作为函数的参数使用
    result = calc(1, 2, func)
    
    print(result)
    
    # 普通函数也可以作为函数的参数使用
    result = calc(5, 2, sum_num)
    
    print(result)
    

    应用二:将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。

    add=lambda x, y: x+y
    
    print(add(1,2))
    

    上述代码中,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行打印add(1,2),输出为3。

    应用三:传递一个函数的结果作为另一个函数的参数

    • 经常可以见到如下调用:
    import thread, time
    thread.start_new_thread(lambda : (thread.interrupt_main(), ), ())  
    
    • lambda在这里的作用是传递一个函数的结果作为另一个函数的参数,例如:
    def perform( fun, *args ):
        fun( *args )
     
    def action1( args ):
        pass
     
    def action2( args ):
        pass
     
    perform( action1 )
    perform( action2, p )
    perform( action3, p, r )
    

    可以被方便的写成:

    def Perform(f):
        f()
     
    Perform(lambda: Action1())
    Perform(lambda: Action2(p))
    Perform(lambda: Action3(p, r))
    

    应用四:在内置函数中使用

    1, 用在过滤函数filter中,指定过滤列表元素的条件:

    filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    

    上述代码运行结果:

    [3, 6, 9]
    

    2, 用在排序函数sorted中,指定对列表中所有元素进行排序的准则:

    sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    

    上述代码运行结果:

    [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

    另外一个例子:

    # 匿名函数可以结合sort方法使用,完成数据的排序
    my_list = [{"name": "zs", "age": 18}, {"name": "ls", "age": 28}]
    
    # 默认是按照升序排序的
    
    # ([参数])-> any 表示匿名函数
    # 下面的代码解释: 变量列表,给匿名函数传入一个字典,根据字典name的value值进行排序
    # my_list.sort(key=lambda x: x["name"])
    # print(my_list)
    
    # 根据年龄进行排序,然后进行数据反转,完成降序
    my_list.sort(key=lambda x: x["age"],reverse=True)
    print(my_list)
    

    3, 用在reduce函数中,指定列表中两两相邻元素的结合条件

    reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    

    上述代码运行结果:

    '1, 2, 3, 4, 5, 6, 7, 8, 9'
    

    4, 用在map函数中,指定对列表中每一个元素的共同操作

    map(lambda x: x+1, [1, 2,3])
    

    上述代码运行结果:

    [2, 3, 4]
    

    5, 从另一函数中返回一个函数,常用来实现函数装饰器(Wrapper),例如python的function decorators

    def transform(n):
            return lambda x: x + n
    f = transform(3)
    print f(3)
    

    上述代码运行结果:

    7
    

    匿名函数特点:

    1.只能有一个表达式
    2.不用return,默认return结果
    3.不需要名字,防止函数名重复
    4.是对象,可赋值给一个变量

    参考:

  • 相关阅读:
    Centos6.8下设置gitlab服务开机自启动,关闭防火墙开机自启动
    gitlab设置SSH key
    在centos6.8下安装gitlab遇到的坑
    recyclerView中的方法
    ListView中的方法
    tcp断开时分几步
    get,post区别
    cookie是什么,在什么地方会用到
    http和https的区别
    keystore是个嘛东西
  • 原文地址:https://www.cnblogs.com/gybb/p/9952184.html
Copyright © 2011-2022 走看看