python 使用 lambda 来创建匿名函数。
对比使用def关键字创建的是有名字的函数,使用lambda关键字创建则是没有名字的函数。
其语法是唯一的,其形式如下:
lambda argument_list: expression
其中,lambda是Python预留的关键字,argument_list和expression由用户自定义。
可简单理解为:
lambda 参数1,参数2,…: 表达式
1、这里的argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的。
2、这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。
3、这里的lambda argument_list: expression表示的是一个函数。这个函数叫做lambda函数。
4、lambda函数输入的是传入到参数列表argument_list的值,输出的是根据表达式expression计算得到的值。
lambda x,y,z:x+y+z
等同于:
def func(x,y,z):
return x+y+z
方式一:
直接调用
res=(lambda x,y,z:x+y+z)(1,2,3)
方式二:
将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
add=lambda x,y:x+y
res=add(1,2)
执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add。
这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3。
但是,“匿名”的本质就是要没有名字,所以此处为匿名函数指定名字是没有意义的。
将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
例如,为了把标准库time中的函数sleep的功能屏蔽,我们可以在程序初始化时调用:
time.sleep=lambda x:None
这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。
例如,执行time.sleep(3)时,程序不会休眠3秒钟,而是什么都不做。
将lambda函数作为其他函数的返回值,返回给调用者。
函数的返回值也可以是函数。例如:
return lambda x, y: x+y
返回一个加法函数。
这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。
对应的,将包含嵌套函数的函数称之为外部函数。
内部函数能够访问外部函数的局部变量,这个特性也是闭包(Closure)编程的基础。
可以将lambda函数作为参数传递给其他函数。
部分内置函数接收函数作为参数。
例如函数map、reduce、filter都支持迭代器协议,可用来处理可迭代对象。
map() 会根据提供的函数对指定序列做映射。
map() 函数语法:
map(function, iterable, …)
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
iterable 表示一个或多个序列
此时lambda函数用于指定对每一个元素的共同操作。
对array的每个元素做平方处理,可以使用map函数。
map函数可以接收两个参数,一个是函数,另外一个是可迭代对象,具体用法如下:
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])
[1, 4, 9, 16, 25]
使用list可以依次迭代res,取得的值作为列表元素。
map会依次迭代array,得到的值依次传给匿名函数(也可以是有名函数),而map函数得到的结果仍然是迭代器。
reduce() 函数会对参数序列中元素进行累积。
reduce() 函数语法:
reduce(function, iterable[, initializer])
reduce函数可以接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值(可选,默认为0)。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:
用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
此时lambda函数用于指定列表中两两相邻元素的结合条件。
注意:Python3.x reduce() 已经被移到 functools 模块里,如果我们要使用,需要引入 functools 模块来调用 reduce() 函数:
from functools import reduce
def add(x, y) : # 两数相加
return x + y
sum1 = reduce(lambda x, y: x+y, [1,2,3,4,5])
print(sum1) # 结果为:15
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
此时lambda函数用于指定过滤列表元素的条件。
例如
filter(lambda x: x % 3 == 0, [1, 2, 3])
指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。
sorted() 函数对所有可迭代的对象进行排序操作。
sort 与 sorted 区别:
sort 是应用在 list 上的方法,返回的是对已经存在的列表进行操作,无返回值
sorted 可以对所有可迭代的对象进行排序操作,返回的是一个**新的 list **,而不是在原来的基础上进行的操作。
sorted 语法:
sorted(iterable, cmp=None, key=None, reverse=False)
参数说明:
iterable:可迭代对象。
cmp:比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)。
>>> L=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> students = [('Jack', 'A', 15), ('Tom', 'B', 12), ('Dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年龄排序
[('Dave', 'B', 10), ('Tom', 'B', 12), ('Jack', 'A', 15)]
>>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('Jack', 'A', 15), ('Tom', 'B', 12), ('Dave', 'B', 10)]
>>>
匿名函数与有名函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放。
所以匿名函数用于临时使用一次的场景,匿名函数通常与其他函数配合使用。
以下为在字典中的用例:
salaries={
'A':6000,
'B':7000,
'C':10000,
'D':8000
}
要想取得薪水的最大值和最小值,我们可以使用内置函数max和min。
>>> max(salaries)
'C'
>>> min(salaries)
'A'
内置max和min都支持迭代器协议,工作原理都是迭代字典,取得是字典的键。
因而比较的是键的最大和最小值,而我们想要的是比较值的最大值与最小值,于是做出如下改动:
>>> max(salaries,key=lambda k:salaries[k])
函数max会迭代字典salaries,每取出一个“人名”就会当做参数传给指定的匿名函数,然后将匿名函数的返回值当做比较依据,最终返回薪资最高的那个人的名字。
同理,我们直接对字典进行排序,默认也是按照字典的键去排序的:
>>> sorted(salaries)
['A', 'B', 'C', 'D']