- 在Python中使用lambda关键字定义匿名函数。lambda关键字定义的 函数也被称为lambda()函数,定义lambda()函数的语法如下。 “参数列表”与函数的参数列表是一样的,但不需要用小括号括起来
- lambda 函数是一种小的匿名函数。
- lambda 函数可接受任意数量的参数,但只能有一个表达式。
语法:
lambda arguments : expression
说明:
- 参数可以一个,也可以多个用逗号隔开,这个参数会用在后边逻辑代码里使用
- 参数后边紧跟着冒号,冒号后边为逻辑代码
- 逻辑代码的计算结果为 lambda 的返回值
- lambda 可以没有参数,如同我们定义无参数的函数一样
注意:
- 无参数的 lambda 可以将函数执行变为可调用对象,在一些高阶函数入参时非常有用
- lambda体部分不能是一个代码块,不能包含多条语句,只有一条语句,语句会计算一个结果并返回给lambda()函数,但与有名称的函数不同的是,不需要使用return语句返回
实例
add = lambda x,y: x+y
add(1,4) # 5
上例中利用 lambda 定义 x 和 y 两个变量,逻辑为把这两个变量相加并返回,再把这个匿名函数赋值给 add, 最后我们就可以把 add 当做一个普通的函数去调用。
当然,我们也可以不用赋值变量,即时定义即时使用调用,如下:
(lambda x,y: x+y)(3,5)
# 8
可以认为 lambda 是一个不需要起名的快捷函数,可以随时定义随时使用。
可以不指定参数,直接返回值:
# 无参数
(lambda : 1)()
# 1
f = lambda : 1
f()
# 1
条件判断
# 两个数的最大值
(lambda x,y: x if x>y else y )(49,5) # 49
和字典结合
# 可以定义在字典的值里,用 key 来调用
d = {'+': lambda x,y: x+y, '-': lambda x,y: x-y}
d['+'](3, 8) # 11
map
# 作为 map 的迭代方法
a = [1, 2, 3, 4, 5, 6]
result = map(lambda x: x+1, a)
list(result)
# [2, 3, 4, 5, 6, 7]
filter
# 作为过虑器的过滤逻辑
a = [1, 2, 3, 4, 5, 6]
result = filter(lambda x: x%2==0, a)
list(result)
reduce
from functools import reduce
# 作为 reduce 累积迭代的方法
a = [1, 2, 3, 4, 5, 6]
result = reduce(lambda x, y: x+y, a)
result
sorted
# 指定属性排序
s = [{'name': 'tom', 'age': 22},
{'name': 'lily', 'age': 19},
{'name': 'lucy', 'age': 20}]
sorted(s, key=lambda x: x['age'])
# [{'name': 'lily', 'age': 19},
# {'name': 'lucy', 'age': 20},
# {'name': 'tom', 'age': 22}]
iter
iter() 函数用来生成迭代器,lambda 中可用 next() 调用:
# 注:x 变量没有用,在一些对象中可用来占位
n = lambda x, y=iter('abcdef'): next(y)
# 可调用 6 次,每次返回其中一个值
n(None) # 'a'
n(None) # 'b'
...
注意
匿名函数是使用 lambda 创建的函数,所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
除了作为参数传给高阶函数之外,Python 很少使用匿名函数。由于句法上的限制,非平凡的 lambda 表达式要么难以阅读,要么无法写出。
lambda 句法只是语法糖:与 def 语句一样,lambda 表达式会创建函数对象。