简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。其一般有如下几种使用方式:
1、lambda的一般形式是关键字lambda后面跟一个或多个html" target="_blank">参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。lambda用来编写简单的函数,而def用来处理更强大的任务。例如:
f = lambda x,y,z : x+y+z print f(1,2,3) g = lambda x,y=2,z=3 : x+y+z print g(1,z=4,y=5)
结果:
6
10
2、lambda表达式常用来编写跳转表(jump table),就是行为的列表或字典。例如:
L = [(lambda x: x**2), (lambda x: x**3), (lambda x: x**4)] print L[0](2),L[1](2),L[2](2) D = {'f1':(lambda: 2+3), 'f2':(lambda: 2*3), 'f3':(lambda: 2**3)} print D['f1'](),D['f2'](),D['f3']()
结果:
4 8 16
5 6 8
3、lambda表达式可以嵌套使用,但是从可读性的角度来说,应尽量避免使用嵌套的lambda表达式。
Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。lamdba函数的正确使用场景:
1、函数式编程
尽管Python算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,Python中,也有几个定义好的全局函数方便使用的,像map、reduce、filter、sorted这些函数都支持函数作为参数,lambda函数就可以应用在函数式编程中。如下:
from functools import reduce foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] print (list(filter(lambda x: x % 3 == 0, foo))) #[18, 9, 24, 12, 27] print (list(map(lambda x: x * 2 + 10, foo))) #[14, 46, 28, 54, 44, 58, 26, 34, 64] print (reduce(lambda x, y: x + y, foo)) #139
2、闭包
闭包本身是一个晦涩难懂的概念,在这里我们以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。lambda函数作为闭包的例子:
>>> def my_add(n): ... return lambda x:x+n
>>> add_3 = my_add(3) >>> add_3(7) 10
这里lambda函数就是一个闭包,在全局作用域范围中,add_3(7)可以正常执行且返回值为10,之所以返回10是因为在my_add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问到。
换成常规函数也可以实现闭包,只不过是这种方式稍显啰嗦,如下:
>>> def my_add(n): ... def wrapper(x): ... return x+n ... return wrapper ... >>> add_5 = my_add(5) >>> add_5(2) 7
不过不是任何情况lambda函数都要比常规函数更清晰明了,看这个例子:
f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
这是返回某个集合的所有子集的lambda函数,相信你要看一会儿才能看明白。
python中有这样一句话是Explicit is better than implicit(明了胜于晦涩)。若用lambda函数不能使代码变得更清晰,就要考虑使用常规的方式来定义函数。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
本文向大家介绍Java函数式编程(一):你好,Lambda表达式,包括了Java函数式编程(一):你好,Lambda表达式的使用技巧和注意事项,需要的朋友参考一下 第一章 你好,lambda表达式! 第一节 Java的编码风格正面临着翻天覆地的变化。 我们每天的工作将会变成更简单方便,更富表现力。Java这种新的编程方式早在数十年前就已经出现在别的编程语言里面了。这些新特性引入Java后,我们可以
this 要在执行时才能确认值,定义时无法确认值 var a = { name:'A', fn:function(){ console.log(this.name); } } a.fn() //this === A a.fn.call({name:'B'}) //this === {name:'B'} var fn1 = a.fn; fn1() //this === windo
闭包主要就是提升函数中变量的作用域,首先要理解作用域 函数作为返回值 function F1() { var a = 100; //返回一个函数(函数作为返回值) return function () { console.log(a);//自由变量,父作用域中查找 } } //f1得到一个函数 var f1 = F1(); var a = 200; f1(); 函数作为参数
本文向大家介绍实例讲解C++编程中lambda表达式的使用,包括了实例讲解C++编程中lambda表达式的使用的使用技巧和注意事项,需要的朋友参考一下 函数对象与Lambdas 你编写代码时,尤其是使用 STL 算法时,可能会使用函数指针和函数对象来解决问题和执行计算。函数指针和函数对象各有利弊。例如,函数指针具有最低的语法开销,但不保持范围内的状态,函数对象可保持状态,但需要类定义的语法开销。
JS基本应用-函数 函数声明与函数表达式、对象实例化的区别 add1(1,1); add2(1,2); add3(1,3); function add1(i, j){ console.log(i+j); } var add2 = function(i, j){ console.log(i+j); } var add3 = new Function("i", "j", "
问题内容: 如何使用带闭包的Java 8编写的方法支持以函数为参数并将函数返回为值的方法? 问题答案: 在Java Lambda API中,主要类是java.util.function.Function。 您可以以与其他所有引用相同的方式使用对该接口的引用:将其创建为变量,然后将其作为计算结果返回,依此类推。 这是一个非常简单的示例,可能会对您有所帮助: 如果需要传递多于1个参数,请看一下方法,但