lambda 表达式常用来声明匿名函数,即没有函数名字的临时使用的小函数,常用在临时需要一个类似于函数的功能但又不想定义函数的场合。
lambda 表达式只可以包含一个表达式,不允许包含其他复杂的语句,但在表达式中可以调用其他函数,该表达式的计算结果相当于函数的返回值。
f = lambda x, y, z: x + y + z # 可以给 lambda 表达式起一个名字
print(f(1, 2, 3)) # 把 lambda 表达式当作函数使用
g = lambda x, y=2, z=3: x + y + z # 支持默认值参数
print(g(1))
print(g(2, z=4, y=5)) # 调用时使用关键参数
L = [(lambda x: x ** 2), (lambda x: x ** 3), (lambda x: x ** 4)]
print(L[0](2), L[1](2), L[2](2))
D = {'i': (lambda: 2 + 3), 'j': (lambda: 2 * 3), 'k': (lambda: 2 ** 3)}
print(D['i'](), D['j'](), D['k']())
s = [1, 2, 3, 4, 5]
print(list(map(lambda i: i + 10, s))) # lambda 表达式作为函数参数
def func(i):
return i * i
func(5)
s = [1, 2, 3, 4, 5]
print(list(map(lambda i: func(i), s))) # lambda表达式中可以调用函数
data = list(range(20))
import random
random.shuffle(data)
print(data)
data.sort(key=lambda x: x) # 用在列表的sort方法中,作为函数参数
print(data)
data.sort(key=lambda x: len(str(x))) # 使用 lambda 表达式指定排序规则
print(data)
data.sort(key=lambda x: len(str(x)), reverse=True) # 使用 lambda 表达式指定排序规则
print(data)
在使用 lambda 表达式时,要注意变量作用域可能带来的问题。
s = []
for i in range(10):
s.append(lambda j=i: j ** 2)
print(s[0](), s[1](), s[-2](), s[-1]())
# 相当于只有一条 return i 语句的小函数
f = lambda: i
i = 3
# 调用时真正的返回值取决于全局变量i的值
print(f())
i = 5
print(f())
虽然使用 lambda 表达式可以很方便灵活地定义一些小函数,但是,如果仅仅是需要一个简单的运算,那么应该尽量使用标准库 operator 中提供的函数,避免自己定义 lambda 表达式,operator 中的函数执行效率更高一些。