lambda 表达式,又称匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。
lambda 表达式的语法格式如下:
name = lambda [list] : 表达式
其中,定义 lambda 表达式,必须使用 lambda 关键字;[list] 作为可选参数,等同于定义函数是指定的参数列表;value 为该表达式的名称。
add = lambda x,y:x+y
print(add(3,4))
7
if 搭配 lambda 使用的效果如下:
add = lambda x,y:x+y if x>3 else 0
print(add(1,4))
print(add(4,4))
0
8
f = lambda x: ['small', 'big'][x>100]
print(f(101))
print(f(99))
big
small
部分Python内置函数接收函数作为参数。典型的此类内置函数有这些。
- filter函数。此时lambda函数用于指定过滤列表元素的条件。
a=filter(lambda x: x % 3 == 0, [1, 2, 3])
print(list(a))
[3]
- sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。
a=sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
print(list(a))
[5, 4, 6, 3, 7, 2, 8, 1, 9]
将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
- map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。
a=map(lambda x: x+1, [1, 2,3])
print(list(a))
[2, 3, 4]
#效果类似于如下的for循环
foo = [1,2,3,4,5]
print( [x * 2 + 10 for x in foo])
print( [x * 2 + 10 if x>4 else 0 for x in foo])
[12, 14, 16, 18, 20]
[0, 0, 0, 0, 20]
- reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
from functools import reduce
a= reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(a))
print(a,type(a))
['1', ',', ' ', '2', ',', ' ', '3', ',', ' ', '4', ',', ' ', '5', ',', ' ', '6', ',', ' ', '7', ',', ' ', '8', ',', ' ', '9']
1, 2, 3, 4, 5, 6, 7, 8, 9 <class 'str'>
对比:
def add(x, y):
return x + y
def mulit(x, y):
return x * y
print(reduce(add, [1, 2, 3, 4, 5])) #输出:15
print(reduce(add, [1, 2, 3, 4, 5], 10)) #输出:25
print(reduce(mulit, [1, 2, 3, 4, 5])) #输出:120
print(reduce(mulit, [1, 2, 3, 4, 5], 10)) #输出:1200
print(reduce(lambda x,y:x+y,[1, 2, 3, 4, 5]))#输出:15
print(reduce(lambda x,y:x+y,[1, 2, 3, 4, 5], 10))#输出:25
print(reduce(lambda x,y:x*y,[1, 2, 3, 4, 5], 10))#输出:1200
15
25
120
1200
15
25
1200