什么是 Lambda 函数?
在python语言中,lambda 也称匿名函数,它只有1行,非常简洁,但与其它函数一样,可以接收多个参数,返回结果。
Lambda 函数在解释器级别,被视为与常规函数相同。可以说:lambda 是返回单行表达式函数的紧凑写法。
lambda最常见的用法是函数式编程,所谓函数式编程,就是允许您将一个函数作为参数提供给另一个函数(例如,map、filter函数等)。在这种情况下,lambda函数提供了一种优雅的方式来创建一次性函数并将其作为参数传递。
语法格式
[ lambda 关键字 ] [参数列表] : [函数体]
- 参数可以是1个或多个,不能放在括号里
- 函数体必须是单行表达式
1) 基础用法:
>>> add_one = lambda x: x + 1
>>> add_one(2)
>>> full_name = lambda first, last: f'Full name: {first.title()} last.title()}'
>>> full_name('guido', 'van rossum')
2) 省略 lambda函数名
(lambda x, y: x + y)(2, 3)
相当于
foo = lambda x,y: x + y
foo(2,3)
3)lambda 内可以使用内置函数
(lambda *args: sum(args))(1,2,3)
4) 与filter() 联合使用,可过滤列表
filter 函数原形 filter(func, list ) , func 可以使用 lambda
ages = [13, 90, 17, 59, 21, 60, 5]
adults = list( filter(lambda age: age>18, ages) )
print(adults)
输出为:
[90, 59, 21, 60]
5) 与map() 联合使用,将函数应用于列表所有元素
What is map?
map() 方法可以将 lambda函数 应用于 list / tuple / dict 的每个元素。返回的是 map 对象。
map是内置方法,先使用常规函数与map配合:
map(func, iterable)
example
def square(x):
return x*x
numbers = [1, 2, 3, 4, 5]
square_numbers = list(map(square, numbers))
print(square_numbers)
output:
[1, 4, 9, 16, 25]
现在改用 lambda 函数,与map配合使用,代码变得相当简洁:
numbers = [1, 2, 3, 4, 5]
square_numbers = list(map(lambda x: x*x, numbers))
处理多个列表时,更为便捷。
numbers_list_1 = [1, 2, 3, 4, 5]
numbers_list_2 = [6, 7, 8, 9, 10]
square_numbers = list(map(lambda x,y: x+y, numbers_list_1, numbers_list_2))
print(square_numbers)
[7, 9, 11, 13, 15]
6) 与reduce() 联合使用,实现循环功能
reduce函数有两个参数,1个是lambda函数,另1个是可迭代的数据类型,如list, tuple 等。
运行时,reduce函数先从列表(或序列)中取出2个元素执行指定函数,并将输出结果与第3个元素传入函数,输出结果再与第4个元素传入函数,…,以此类推,直到列表每个元素都取完。
from functools import reduce
data = [1, 2, 3, 4, 5]
add = lambda x, y: x + y
print(reduce(add, data))
输出为
15
什么时候不应该使用 Lambda?
切勿在生产环境中编写复杂的 lambda 函数。写得太复杂的单行表达式,让后期维护代码的人很看懂需要记住,这时应改为标准函数来写多行代码.
总结
- Lambda,也称为匿名函数,是不需要名称(即标识符)的小型受限函数。
- Python 中的每个 lambda 函数都有 3 个基本部分:
[ lambda 关键字 ] [参数列表] : [函数体]
- Lambdas通常与以下python内置一起使用:filter, map, reduce 等函数一起使用。
filter(lambda 参数:表达式,可迭代序列)
map(lambda 参数:表达式,可迭代序列)
reduce lambda 参数 1,参数 2:表达式,可迭代序列) - 不要在生产环境中编写复杂的 lambda 函数,因为会让代码维护者难以理解