在日常使用过程中,其实很容易区lambda与def,只是这里再重申一次,更为通熟易懂的能够来看待lambda的一些特性。它的写法: 一般形式是关键字lambda,之后是一个或多个参数(与一个def头部内用括号括起来的参数列表及其相似),紧跟的是一个冒号,之后是一个表达式:
lambda arg1,arg2,.....argN: expression using args
一、lambda与def差异
1、lambda就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名,它是匿名的,没有函数名称;对于def来说呢,会把函数对象赋值给一个变量,也就是函数名称。
2、lambda它只是一个表达式,而def则是一个语句。如何来理解这个表达式与语句的区别?
a、语句是使用关键字来组成命令,告诉解释器完成某个任务的命令。
b、语句可有输出,也可以没输出。
c、表达式没有关键字,可以是由数学操作符组成的算术表达式,也可以是括号调用的函数。
# 表达式 2*3/4 #语句 print(2*3/4)
3、除了这些差别,def和lambda都能够做同样种类的工作。
二、为什么使用lamdba
1、因为lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义,省去函数定义的过程。
2、当需要把小段的可执行代码编写进def语句从语法上不能编写进的地方时,很有用。比如说:列表常量中。
三、如何使用
1、常规用法
# 1、例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列 list1 = [3,5,-4,-1,0,-2,-6] sorted(list1, key=lambda x: abs(x)) # 输出[0, -1, -2, 3, -4, 5, -6] # 2、例如:跳转表 L = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4] for f in L: print(f(2)) print(L[0](3))
2、配合常用函数式编程工具
对于序列来讲,有三个函数式编程工具: filter()、map()和reduce()。将lambda函数作为参数传递给这些方法。
#map(function,sequence):把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。如果function有两个参数,即map(function,sequence1,sequence2)。 #求1~20的平方 >>> list(map(lambda x:x*x,range(1,21))) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400] #filter(function,sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回。 #求1~20之间的偶数 >>> list(filter(lambda x:x%2 == 0,range(1,21))) [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] #reduce(function,sequence):function接收的参数个数只能为2,先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。 #求1~100之和 >>> from functools import reduce #Python3.x之后需要导入reduce模块 >>> reduce(lambda x,y:x+y,range(1,101)) 5050
3、闭包
闭包:一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。lambda中实现闭包则是将lambda函数作为其他函数的返回值,返回给调用者。
来看一个用lambda函数作为闭包的例子。
def add(n): return lambda x:x+n add2 = add(5) add2(15) 20
这里的lambda函数就是一个闭包,在全局作用域范围中,add2(15)可以正常执行且返回值为20。之所以返回20是因为在add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问到。
四、注意:python代码,简洁优于复杂,明确优于晦涩!
1、作用域
lambda是嵌套函数作用域查找E的最大受益者。嵌套的lambda能够获取得到在上层函数作用域中的变量的值。
F = lambda x: x + 5 print(F(3)) #8 tmplist = [] for i in range(5): tmplist.append(lambda: i + 3) for t in tmplist: print(t()) # 7 7 7 7 7