1. 引言
Lambda 表达式是 Python 中一种简洁的匿名函数定义方式,它允许我们在不显式使用def关键字的情况下,快速创建一个小型函数。Lambda 表达式源自函数式编程思想,在数据处理、排序、过滤等场景中非常实用。
2. 什么是 Lambda 表达式
2.1 基本语法
Lambda 表达式的基本语法非常简单:
lambda参数列表:表达式它由三部分组成:lambda关键字、参数列表(可省略括号)和冒号后的表达式。表达式的结果就是函数的返回值。
举个简单的“栗子”
lambdan:n+1print(n(1))#输出22.2 与普通函数的对比
# 普通函数defadd(x,y):returnx+y# 等价的 lambda 表达式add_lambda=lambdax,y:x+yprint(add(3,5))# 输出 8print(add_lambda(3,5))# 输出 8两者功能完全一致,但 lambda 写法更紧凑。
3. Lambda 的核心用法
3.1 作为参数传递
Lambda 最常见的用途是作为高阶函数的参数,例如sorted、map、filter等:
# 按字符串长度排序words=["apple","kiwi","banana","pear"]sorted_words=sorted(words,key=lambdaw:len(w))print(sorted_words)# ['kiwi', 'pear', 'apple', 'banana']3.2 与 map 结合
# 对列表每个元素求平方nums=[1,2,3,4,5]squares=list(map(lambdax:x**2,nums))print(squares)# [1, 4, 9, 16, 25]3.3 与 filter 结合
# 筛选出偶数nums=[1,2,3,4,5,6]evens=list(filter(lambdax:x%2==0,nums))print(evens)# [2, 4, 6]3.4 与 reduce 结合
fromfunctoolsimportreduce# 计算列表累加和nums=[1,2,3,4,5]total=reduce(lambdaa,b:a+b,nums)print(total)# 154. 进阶技巧
4.1 多参数与默认参数
# 多参数area=lambdaw,h:w*hprint(area(4,5))# 20# 默认参数greet=lambdaname="World":f"Hello,{name}!"print(greet())# Hello, World!print(greet("Python"))# Hello, Python!4.2 在排序中指定多条件
students=[{"name":"Alice","score":88},{"name":"Bob","score":92},{"name":"Cathy","score":88},]# 先按分数降序,再按姓名升序students.sort(key=lambdas:(-s["score"],s["name"]))print(students)4.3 条件表达式
# 使用三元表达式实现简单判断max_func=lambdaa,b:aifa>belsebprint(max_func(10,20))# 205. 注意事项与常见误区
5.1 不要滥用 Lambda
Lambda 适合简单表达式。如果逻辑复杂,应使用普通函数,以保证可读性:
# 不推荐:逻辑过于复杂result=lambdax:x*2+1ifx>0elsex*3-1ifx<0else0# 推荐:使用普通函数defcomputer(x):ifx>0:returnx*2+1elifx<0:returnx*3-1return05.2 只能包含单个表达式
Lambda 内部不能包含赋值语句、多行语句或return关键字,它只能是一个表达式。
5.3 避免在循环中捕获变量
# 陷阱:所有 lambda 都捕获同一个变量funcs=[lambda:iforiinrange(3)]print([f()forfinfuncs])# [2, 2, 2]# 解决:使用默认参数绑定当前值funcs=[lambdai=i:iforiinrange(3)]print([f()forfinfuncs])# [0, 1, 2]