什么时候使用Lambda函数?

简介:

什么时候使用Lambda函数?


Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数。

Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。

好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情。

先来看个简单 lambda 函数

 
  1. >>> lambda x, y : x+y 
  2.  
  3. <function <lambda> at 0x102bc1c80>  

x 和 y 是函数的两个参数,冒号后面的表达式是函数的返回值,你能一眼看出这个函数就是是在求两个变量的和,但作为一个函数,没有名字如何使用呢?这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能

 
  1. >>> add = lambda x, y : x+y 
  2.  
  3. >>> add 
  4.  
  5. <function <lambda> at 0x102bc2140> 
  6.  
  7. >>> add(1,2) 
  8.  
  9. 3  

它等同于常规函数

 
  1. >>> def add2(x, y): 
  2.  
  3. ... return x+y 
  4.  
  5. ... 
  6.  
  7. >>> add2 
  8.  
  9. <function add2 at 0x102bc1c80> 
  10.  
  11. >>> add2(1,2) 
  12.  
  13. 3  

如果定义匿名函数,还要给它绑定一个名字的话,有点画蛇添足,通常是直接使用 lambda 函数。那么 lamdba 函数的正确使用场景在哪呢?

1、函数式编程

尽管 Python 算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像 map、reduce、filter、sorted 这些函数都支持函数作为参数,lambda 函数就可以应用在函数式编程中。

请看题:一个整数列表,要求按照列表中元素的绝对值大小升序排列,你会怎么做?思考一分钟往下看

 
  1. >>> list1 = [3,5,-4,-1,0,-2,-6] 
  2.  
  3. >>> sorted(list1, key=lambda x: abs(x)) 
  4.  
  5. [0, -1, -2, 3, -4, 5, -6]  

排序函数 sorted 支持接收一个函数作为参数,该参数作为 sorted 的排序依据,这里按照列表元素的绝对值进行排序,当然,我也可以用普通函数来实现:

 
  1. >>> def foo(x): 
  2.  
  3. ... return abs(x) 
  4.  
  5. ... 
  6.  
  7. >>> sorted(list1, key=foo) 
  8.  
  9. [0, -1, -2, 3, -4, 5, -6]  

只不过是这种方式代码看起来不够 Pythonic 而已。

2、闭包

闭包本身是一个晦涩难懂的概念,它可以专门单独用一篇文章来介绍,不过在这里我们可以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。

来看一个用 lambda 函数作为闭包的例子。

 
  1. >>> def my_add(n): 
  2.  
  3. ... return lambda x:x+n 
  4.  
  5. ... 
  6.  
  7. >>> add_3 = my_add(3) 
  8.  
  9. >>> add_3(7) 
  10.  
  11. 10  

这里的 lambda 函数就是一个闭包,在全局作用域范围中,add_3(7) 可以正常执行且返回值为10,之所以返回10是因为在 my_add 局部作用域中,变量 n 的值在闭包的作用使得它在全局作用域也可以被访问到。

换成常规函数也可以实现闭包,只不过是这种方式稍显啰嗦。

 
  1. >>> def my_add(n): 
  2.  
  3. ... def wrapper(x): 
  4.  
  5. ... return x+n 
  6.  
  7. ... return wrapper 
  8.  
  9. ... 
  10.  
  11. >>> add_5 = my_add(5) 
  12.  
  13. >>> add_5(2) 
  14.  
  15. 7  

那么是不是任何情况 lambda 函数都要比常规函数更清晰明了呢?看这个例子:

 
  1. f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))] 

这是一个返回某个集合的所有子集的 lambda 函数,你看明白了吗?我是很难一眼看出来

zen of python 中有这样一句话是 Explicit is better than implicit(明了胜于晦涩)。记住,如果用 lambda 函数不能使你的代码变得更清晰时,这时你就要考虑使用常规的方式来定义函数。


作者:佚名

来源:51CTO

相关文章
|
4月前
|
C#
C# Lambda
C# Lambda
21 0
|
4月前
获取lambda
获取lambda
21 0
|
4月前
|
Python
lambda
lambda 是一个匿名函数,它通常用于简化代码,使代码更简洁、易读。lambda 函数不需要显式地使用 def 关键字进行定义,可以直接在表达式中使用。它的语法如下:
68 6
|
4月前
|
SQL Java 程序员
聊聊lambda
聊聊lambda
25 1
|
4月前
lambda小技巧
lambda小技巧
25 0
|
5月前
|
编译器
匿名函数lambda
匿名函数lambda
31 0
|
7月前
|
算法 编译器
【lambda函数】lambda()函数
【lambda函数】lambda()函数
|
7月前
|
设计模式 Java API
值得使用Lambda的8个场景,别再排斥它了!
前言 可能对不少人来说,Lambda显得陌生又复杂,觉得Lambda会导致代码可读性下降,诟病Lambda语法,甚至排斥。
|
7月前
|
算法 编译器 容器
|
9月前
|
Java 开发者
lambda让代码更优雅
Lambda表达式是Java 8中引入的一个重要特性,它允许开发者以更简洁的方式编写匿名函数,使得代码更加紧凑和易读。Lambda表达式是函数式编程的一种体现,可以将函数作为方法的参数传递,并且可以使用更简洁的语法实现函数式接口(只有一个抽象方法的接口)的实例化。Lambda表达式的语法形式为 (参数列表) -> {表达式或语句块}。
53 0