• 【Python知识】匿名函数lambda


    一、提要

      在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda?下面就上面的问题进行一下解答。

    二、lambda是什么?

            Lambda 表达式(lambda expression)是一个匿名函数Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数Lambda表达式可以表示闭包

    2.1 看几个例子      

    g = lambda x:x+1

    看一下执行的结果: 

    g(1)

    >>>2

    g(2)

    >>>3

    你也可以这样使用:

    lambda x:x+1(1)

    >>>2   

      可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为:

    1 def g(x):
    2     return x+1

      非常容易理解,在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。

    2.2 lambda函数的四个形式

    labmda函数由简单到复杂,存在四种形象: 

    1. # 1)无参数
    2. lambda_a = lambda: 100
    3. print(lambda_a())
    4. # 2)一个参数
    5. lambda_b = lambda num: num * 10
    6. print(lambda_b(5))
    7. # 3)几个参数
    8. lambda_c = lambda a, b, c, d: a + b + c + d
    9. print(lambda_c(1, 2, 3, 4))
    10. # 4)带表达式分支
    11. lambda_d = lambda x: x if x % 2 == 0 else x + 1
    12. print(lambda_d(6))
    13. print(lambda_d(7))

            Python中,也有几个定义好的全局函数与lambda配合,filter, map, reduce配合使用。

    三、与map函数复合

    3.1 map函数的概念

            map函数,是对一个序列数,逐个采用某个函数处理的结果,其结果是一个可迭代对象:

            语法形式:

    map(function, iterable, ...)

    范例1:

    1. def square(x) : # 计算平方数
    2. return x ** 2
    3. lst = [1,2,3,4,6]
    4. ss = list( map(square, lst ) ) # 计算列表各个元素的平方
    5. print(ss)

     结果:[1, 4, 9, 16, 36]

    范例2:

    1. def square(x,y) : # 计算平方数
    2. return x ** 2 + y**2
    3. lst1 = [1,2,3,4,6]
    4. lst2 = [5,4,3,2,1]
    5. ss = list( map(square, lst1, lst2) ) # 计算列表各个元素的平方
    6. print(ss)

     3.2 lambda和map复合

    范例1:

    1. lst = [1,2,3,4,6]
    2. ss = list( map(lambda x: x**2 , lst ) ) # 计算列表各个元素的平方
    3. print(ss)

    范例2

    1. square = lambda x,y : x ** 2 + y**2
    2. lst1 = [1,2,3,4,6]
    3. lst2 = [5,4,3,2,1]
    4. ss = list( map(square, lst1, lst2) ) # 计算列表各个元素的平方
    5. print(ss)

    四、与filter函数复合

    4.1 filter函数

    filter() 函数从指定函数,和指定序列中,返回 True 的元素:

    语法: filter(function,iterable ) 

     filter() 有两个输入形参:

    • function - a function
    • iterable - an iterable like setsliststuples etc.

    案例1:

    1. letters = ['a', 'b', 'd', 'e', 'i', 'j', 'o']
    2. # a function that returns True if letter is vowel
    3. def filter_vowels(letter):
    4. vowels = ['a', 'e', 'i', 'o', 'u']
    5. return True if letter in vowels else False
    6. filtered_vowels = filter(filter_vowels, letters)
    7. # converting to tuple
    8. vowels = tuple(filtered_vowels)
    9. print(vowels)

    案例2:

    1. # random list
    2. random_list = [1, 'a', 0, False, True, '0']
    3. filtered_iterator = filter(None, random_list)
    4. #converting to list
    5. filtered_list = list(filtered_iterator)
    6. print(filtered_list)

    4.2 与lambda联合使用 

    下例,求序列的偶数:

    1. numbers = [1, 2, 3, 4, 5, 6, 7]
    2. # the lambda function returns True for even numbers
    3. even_numbers_iterator = filter(lambda x: (x%2 == 0), numbers)
    4. # converting to list
    5. even_numbers = list(even_numbers_iterator)
    6. print(even_numbers)

     五、和reduce联合使用

    5.1 reduce的基本概念

            reduce() 函数会对参数序列中元素进行累积。

            函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

    语法:reduce(function,iterable ) 

    范例1:求阶乘

    1. from functools import reduce
    2. def multi(x,y):
    3. return x*y
    4. foo = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    5. print ( reduce(multi, foo) )

     5.2 reduce 和lambda配合

    范例1:求阶乘

    1. from functools import reduce
    2. foo = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    3. print ( reduce(lambda x, y: x * y, foo) )

     范例2:复杂用法

    1. # python code to demonstrate working of reduce()
    2. # using operator functions
    3. # importing functools for reduce()
    4. import functools
    5. # importing operator for operator functions
    6. import operator
    7. # initializing list
    8. lis = [1, 3, 5, 6, 2, ]
    9. # using reduce to compute sum of list
    10. # using operator functions
    11. print("The sum of the list elements is : ", end="")
    12. print(functools.reduce(operator.add, lis))
    13. # using reduce to compute product
    14. # using operator functions
    15. print("The product of list elements is : ", end="")
    16. print(functools.reduce(operator.mul, lis))
    17. # using reduce to concatenate string
    18. print("The concatenated product is : ", end="")
    19. print(functools.reduce(operator.add, ["geeks", "for", "geeks"]))

    六、小结 

     上面例子中的map的作用,非常简单清晰。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。

    6.1 等价的其它语句

      比如上面map的例子,可以写成:  

      print( [x * 2 + 10 for x in foo] )

      非常的简洁,易懂。

      filter的例子可以写成:

       print( [x for x in foo if x % 3 == 0] )

      同样也是比lambda的方式更容易理解。

    6.2 结论和建议

    •   lambda 定义了一个匿名函数
    •   lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
    •   如果可以使用for...in...if来完成的,坚决不用lambda。
    •   如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。

  • 相关阅读:
    【哲学问题】-《哲学家们都干了些什么?》
    滑动窗口算法
    Gin程序热加载
    Android Tv连接charles
    体验 Shifu 解决报错流程
    深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」
    [附源码]Python计算机毕业设计电子工厂进销存管理系统
    纵览机器学习前生今世,万字整理谷歌首席科学家 Jeff Dean 一小时演讲
    【算法入门-Python】02_递归
    tf.gather_nd
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/126532692