• Python笔记:lambda匿名函数


    在Python中,一般使用def关键字来定义普通函数。顾名思义,匿名函数意味着函数没有名称,Python使用lambda关键字定义匿名函数。在某些情况下,使用匿名函数可以简化代码,提高代码的可读性。本文介绍python匿名函数的使用方法。

    匿名函数

    Python匿名函数的语法格式:

    lambda argument1, argument2,... argumentN: expression
    

    匿名函数可以有多个参数,只有一个表达式。下面来看一下普通def函数和lambda函数的区别:

    def cube(y):
        return y*y*y
    
    lambda_cube = lambda y: y*y*y
    
    print(cube(3))
    print(lambda_cube(3))
    

    执行结果:

    27
    27
    

    可以看到,lambda函数更加简洁,不包含“return”语句,返回的是一个函数对象。与常规函数还有以下区别:

    1、lambda 是一个表达式,不是一个语句

    • 表达式(expression)是用“公式”去表达一个东西,比如y*y*y就是一个表达式

    • 语句(statement)是完成了某些功能,比如赋值语句,条件语句等

    • 由于lambda 是表达式,它可以用在一些常规函数 def 不能用的地方,比如,可以用在列表内部,可以作为某些函数的参数。

    lambda 函数在列表推导式中使用:

    list_num = [3, 4, 6, 2, 5, 8]
    list_square = [x ** 2 for x in list_num if x % 2 == 0]
    list_square2 = [(lambda x: x** 2)(x) for x in list_num if x % 2 == 0]
    print(list_square)
    print(list_square2)
    

    执行结果:

    [16, 36, 4, 64]
    [16, 36, 4, 64]
    

    作为函数的参数:根据字典值降序排序

    mydict = {1:"apple",3:"banana",2:"orange"}
    mydict = sorted(mydict.items(), key=lambda x: x[0], reverse=True)
    print(mydict)
    

    执行结果:

    [(3, 'banana'), (2, 'orange'), (1, 'apple')]
    

    2、lambda表达式只有一行,不能写成多行的代码块。

    lambda 用于快速编写简单函数,对于更复杂的多行逻辑使用常规函数来实现。关于这点,Python 之父 Guido van Rossum 曾发了一篇文章解释:Language Design Is Not Just Solving Puzzles

    Lambda函数具有函数式编程的特性,关于函数式编程这里不做介绍,后面有时间单独写一篇文章。Lambda函数可以与filter()、map()和reduce()等内置函数一起使用,下面介绍使用方法。

    filter()函数

    Python中的filter()函数接受一个函数对象和一个可迭代对象作为参数。

    filter(function or None, iterable)
    

    filter()函数对iterable中的每个元素都进行 function 判断,并返回 True 或者 False,最后将返回 True 的元素组成一个新的可遍历的集合。

    list_num = [3, 4, 6, 2, 5, 8]
    
    list_even = list(filter(lambda x: x % 2 == 0, list_num))
    print(list_even)
    
    list_even2 = [i for i in list_num if i % 2 == 0]
    print(list_even2)
    
    list_even3 = []
    for i in list_num:
        if i % 2 == 0:
            list_even3.append(i)
    print(list_even3)
    
    

    执行结果:

    [4, 6, 2, 8]
    [4, 6, 2, 8]
    [4, 6, 2, 8]
    

    如果是None,可用于过滤空格,返回为true的可遍历集合:

    list1 = ['', None, 6, 2, False, 8, True]
    list1 = list(filter(None, list1))
    print(list1)
    

    执行结果:

    [6, 2, 8, True]
    

    map() 函数

    和filter()类似,map(function, iterable) 函数表示对 iterable 中的每个元素,都运用 function 这个函数,最后返回一个新的可遍历的集合:

    list_num = [3, 4, 6, 2, 5, 8]
    list_square = list(map(lambda x: x**2, list_num))
    print(list_square)
    
    list_num = [3, 4, 6, 2, 5, 8]
    list_square2 = [(lambda x: x** 2)(x) for x in list_num]
    print(list_square2)
    
    list_square3 = [x**2 for x in list_num]
    print(list_square3)
    

    执行结果:

    [9, 16, 36, 4, 25, 64]
    [9, 16, 36, 4, 25, 64]
    [9, 16, 36, 4, 25, 64]
    

    reduce() 函数

    reduce(function, iterable)函数同样接收一个函数和一个列表作为参数,reduce()函数属于functools模块,通常用来对一个集合做一些累积操作。function 对象有两个参数,表示对 iterable 中的每个元素以及上一次调用后的结果,运用 function 进行计算,也就是执行重复操作,最终返回一个数值。

    from functools import reduce
    
    list_num = [3, 4, 6, 2, 5, 8]
    sum = reduce(lambda x, y: x + y, list_num)
    print(sum) # 输出:28 = 3 + 4 + 6 + 2 + 5 + 8
    

    总结

    本文介绍了lambda函数和常见的 map(),fiilter() 和 reduce() 三个函数,匿名函数通常用于实现一个简单功能,并且该函数只调用一次。

    map(),fiilter() 和 reduce() 三个函数通常与lambda函数结合使用,它们的功能也可以使用列表推导式 (List Comprehension)来实现。它们的性能差异不大,可以根据自己习惯使用。

    --THE END--

    欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

  • 相关阅读:
    【算法】二分图的判定
    【模板】并查集 两种路径压缩写法(类模板和函数模板)
    【模板】堆的结构
    新疆大学OJ(ACM) 1099: 数列有序!
    新疆大学OJ(ACM) 1047: string 字符串排序
    新疆大学(新大)OJ xju 1010: 四个年级 C++ STL map 将4层循环优化成2层循环可解
    新疆大学(新大)OJ xju 1009: 一带一路 prim求最短路径+O(n)素数筛选
    新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘
    【算法】第二类斯特林数Stirling
    【复习资料】编译原理中:短语,直接短语,句柄
  • 原文地址:https://www.cnblogs.com/hiyong/p/14853254.html
Copyright © 2020-2023  润新知