python匿名函数:lambda
关键字lambda
python使用lambda关键字来创造匿名函数,即不再使用def的语句这样标准形式定义一个函数,语法:
lambda [arg1[,arg2, ... argN]]:expression
例子
$ python Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> def add(a, b): ... return a + b ... >>> print (add(3,5)) 8 >>> #等价lambda写法,一般不会绑定名字 ... >>> add = lambda x, y : x + y >>> add(3,5) 8 >>>
在
lambda x,y : x+y
中,x,y是函数的两个参数,冒号后面的表达式是函数的返回值。通常情况下,使用匿名函数是不给其绑定名字的。使用场景
函数式编程
python提供了很多函数式编程的特性,像map、reduce、filter、stored这些函数都支持函数作为参数。lambda函数就可以引用在函数式编程中。
>>> #绝对值排序 ... >>> abs_sorte = [1, 2, -4, 9, -8] >>> sorted(abs_sorte, key = lambda x: abs(x)) [1, 2, -4, -8, 9] >>> #等价function ... >>> def abss(x): ... return abs(x) ... >>> sorted(abs_sorte, key = abss) [1, 2, -4, -8, 9] >>>
闭包 :一个定义在函数内部的函数
>>> #lambda函数作为闭包 ... >>> def add(x): ... return lambda t: x + t ... >>> add_1 = add(3) >>> add_1(10) 13 >>>
在全局作用域中,add_1(10)可以正常执行返回结果,结果是13是因为在add的局部作用域中,变量t的值在闭包的作用使其可以在全局作用域中被访问到。
>>> #常规函数实现闭包 ... >>> >>> def add(n): ... def addp(x): ... return x + n ... return addp ... >>> add_1 = add(3) >>> add_1(10) 13 >>>
当然,并不是所有情况lambda函数都比常规函数更清晰,如果使用lambda函数不能使代码变得更清晰,就要使用常规的方法定义函数。
Just as : Explicit is better than implicit