什么时候使用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

时间: 2024-09-15 23:07:31

什么时候使用Lambda函数?的相关文章

在C++中使用Lambda函数提高代码性能

使编译器以及操作系统从正在创建的应用中榨取更高性能的关键在于提供充足的有关代码意图的信息.在充分了解这个代码意图实现的功能等信息的情况下,就有可能将代码在编译时和运行时的并行吞吐量最大化,令开发者可以将更多精力放在他们所关注的商业领域的问题,将重量级的多核多处理器的任务计划交托给编译器,运行时库以及操作系统中的基础设施代码来处理. 循环函数是很重要的一个环节,因为在所有可用的硬件资源中,被分离的循环中的各个部分在一般情况下能够提供更高的应用性能.考虑这样一个小情况:迭代选定组合中的全部元素以求得

透视Ruby 1.9的Lambda函数

Ruby的Block块是它的关键特色之一,用块能够写出简明且高度可重用的算法.即使没有别的用处,它 至少消弱了人们对循环敬畏的态度.这个概念在其他语言和理论中还被称为: ◆lambda函数 ◆匿名函数 ◆闭包(参见Java 7中lambda函数所使用的名称) 这是个十分令人迷惑的词汇,因为闭包这个词汇还指对代码作用域的捕获.而块则不需要捕获这个作 用域--例如下面的代码: x = lambda {|x,y| x + y} 没有使用自由变量(没有绑定的变量:参数列表中正式声明x和y),因此无须创建

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译   C++11终于知道要在语言中加入匿名函数了.匿名函数在很多时候可以为编码提供便利,这在下文会提到.很多语言中的匿名函数,如C++,都是用Lambda表达式实现的.Lambda表达式又称为lambda函数.我在下文中称之为Lambda函数. 为了明白Lambda函数的用处,请务必先搞明白C++中的

详解Python的Lambda函数与排序_python

lambda函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方.下面的例子比较了传统的函数与lambda函数的定义方式. 前几天看到了一行求1000的阶乘的Python代码 Python代码 print reduce(lambda x,y:x*y, range(1, 1001)) 一下子被python代码的精简与紧凑所折服,故对代码进行了简单的分析. reduce与range都是Python的内置函数. range(1,1001)表示生成1到1000的连续整数

python中lambda函数 list comprehension 和 zip函数使用指南_python

lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数.这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方. def f(x): return x*2,用lambda函数来替换可以写成:g = lambda x: x*2`g(3)结果是6.(lambda x: x*2)(3)`也是同样的效果. 这是一个 lambda 函数,完成同上面普通函数相同的事情.注意这里的简短的语法:在参数列表周围没有括号,而且忽略了 return 关键字

简单介绍Python中的filter和lambda函数的使用_python

filter(function or None, sequence),其中sequence 可以是list ,tuple,string.这个函数的功能是过滤出sequence 中所有以元素自身作... filter(function or None, sequence),其中sequence 可以是list ,tuple,string.这个函数的功能是过滤出sequence 中所有以元素自身作为参数调用function时返回True或bool(返回值)为True的元素并以列表返回. filter

PHP V5.3 中的新特性,第 2 部分: 闭包及 lambda 函数

闭包函数和 lambda 函数绝对不是新出现的概念:它们均来自函数编程领域.函数编程 是一种编程风格,它将关注点从执行命令转移到表达式计算.这些表达式是使用函数构成的,结合这些函数可以得到我们要查找的结果.这种编程风格最常用于学术目的,但是也可以在人工智能与数学领域中见到,并且可以在用 Erlang.Haskell 及 Scheme 等语言编写的商业应用程序中找到. 闭包 最初是在 20 世纪 60 年代作为 Scheme 的一部分开发的,Scheme 是最著名的函数编程语言之一.Lambda

《Python数据科学指南》——1.16 使用lambda创造匿名函数

1.16 使用lambda创造匿名函数 匿名函数是由Python中的lambda语句产生的.一个没有被命名的函数就是匿名函数. 1.16.1 准备工作 如果你掌握了将函数作为参数传递的内容,你会发现这节的示例和它非常相似.这节我们会传递一个预定义的函数,一个lambda函数. 1.16.2 操作方法 我们写一个简单的操作小型数据集的示例,来解释Python中的匿名函数. # 1.创建一个简单的列表,写一个类似于1.13节"将函数作为参数传递"中的函数 a =[10,20,30] def

Python的lambda匿名函数的简单介绍_python

lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: 复制代码 代码如下: def f(x):return x**2print f(4) Python中使用lambda的话,写成这样 复制代码 代码如下: g = lambda x : x**2print g(4) lambda表达式在很多编程语言都有对应的实现.比如C#: 复制代码 代码如下: var g = x => x**2Console.WriteLine(g(4)) 那么,lambda表达式有什么用处呢?很多人提