lambda表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。
lambda 表达式的语法格式如下:
func = lambda [arg1[, arg2, ... argN]] : expression
定义 lambda 表达式,必须使用 lambda 关键字;[arg1[, arg2, … argN]] 作为可选参数,等同于定义函数时要指定的参数列表。expression表示一行表达式,其运算的结果就是函数的返回值。func是一个变量,引用lambda定义的函数对象。
该语法格式转换成普通函数的形式,如下所示:
def func([arg1[, arg2, ... argN]]):
return expression
显然,使用普通方法定义此函数,需要 3 行代码,而使用 lambda 表达式仅需 1 行。
例如,如果设计一个求 2 个数之和的函数,使用普通函数的方式,定义如下:
def add(x, y):
return x+ y
print(add(3,4)) # 打印 7
上面程序中,add() 函数内部仅有 1 行表达式,因此该函数可以直接用 lambda 表达式表示:
add = lambda x,y:x+y
print(add(3,4)) # 打印 7
相比def函数,lamba 表达式具有以下 2 个优势:
为什么要使用lambda?
对于序列中的元素进行筛选,最终获取符合条件的序列。
#示例1
l = list(filter(lambda x:True if x % 3 == 0 else False, range(100)))
print(l)
'''
输出结果:
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
'''
如上所示,使用lambda表达式定义了一个匿名函数,用于筛选100以内的3的倍数,并生成一个列表。使用def函数表示如下:
#示例2
def f(x):
if x % 3 == 0 :
return True
else:
return False
l = list( filter(f, range(100) ))
print(l)
filter()简单的理解为过滤器,它需要两个参数,function和一个序列(字符串、列表、元组都是序列),过滤器会依次将序列的值传入function中,如果返回True的话,将其重新生成一个列表返回。
map()能够遍历序列,对序列中每个元素进行操作,最终获取新的序列。
#示例3
li = [11, 22, 33]
sl = [1, 2, 3]
new_list = map(lambda a, b: a + b, li, sl)
print(list(new_list))
# 输出结果为:
[12,24,36]
map()表示映射,filter()表示过滤,map()用法与filter()类似,也是将序列放入函数进行运算,但是,不论运算结果是什么,map()都将逐一反馈,这是map()和filter()的主要区别。注意,filter()和map()中的function都必要有一个返回值。
#示例4
l = list(map(lambda x:True if x % 3 == 0 else False, range(100)))
print(l)
'''
输出结果为:
[True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True]
'''
对于序列内所有元素进行累计操作。
#示例5
from functools import reduce
li = [11,22,33]
result = reduce(lambda a,b:a+b,li)
# reduce的第一个参数,函数必须要有两个参数
# reduce的第二个参数,要循环的序列
# reduce的第三个参数,初始值
print(result)
'''
输出结果:
66
'''
用lambda表达式求n的阶乘。
#示例6
from functools import reduce
n = 5
print( reduce(lambda x,y:x*y,range(1,n+1)) )
'''
输出结果:
120
'''
#示例7
def f(a):
return lambda b : a + b
a = f(10)
print( a(20)) # 30
lambda也可以嵌套在一个函数内使用,在上面示例中函数中嵌套了一个lambda表达式。变量a引用的就是lambda表达式定义的函数对象。
#示例8
#上面示例可以使用两个lambda表示:
x = lambda a: lambda b: a+b
y= x(10)
print(y(20)) # 30
#示例9
# 根据每个元祖的第一个元素进行排序
a = [(1, 2), (4, 1), (9, 10), (13, -3)]
a.sort(key=lambda x: x[1])
print(a)