Python(十六) 中的 lambda 匿名函数在 Python 中,lambda 用来定义一种简单的匿名函数。
所谓“匿名函数”,就是没有名字的函数。
普通函数通常使用 def 定义,并且有函数名:
而 lambda 函数通常写得更短:
它们的作用都可以是计算两个数的和。
通俗地说:
lambda 匿名函数像一个临时小工具,常常用完就走。基本格式:
可以拆开理解:
示例:
这个匿名函数的意思是:
注意:lambda 函数会自动返回表达式的结果,不需要写 return。
普通函数写法:
输出结果:
lambda 写法:
输出结果:
这两个例子效果一样。
区别可以这样理解:
def:适合定义较完整、较复杂、需要反复使用的函数。提醒:
虽然 lambda 可以赋值给变量,但如果函数需要长期使用,通常更推荐用 def。lambda 本身是一个函数,可以像普通函数一样调用。
输出结果:
这里:
lambda a, b: a + b 定义了一个匿名函数。也可以直接调用匿名函数:
result = (lambda a, b: a + b)(3, 5)输出结果:
不过这种写法初学阶段不常用,了解即可。
lambda 可以没有参数,也可以有一个或多个参数。
输出结果:
输出结果:
输出结果:
lambda 也可以使用默认参数。
power = lambda x, n=2: x ** n输出结果:
解释:
lambda 会自动返回冒号后面表达式的结果。
示例:
get_max = lambda a, b: a if a > b else b输出结果:
这里没有写 return,但它会自动返回:
注意:
错误写法:
add = lambda a, b: return a + b正确写法:
lambda 函数的冒号后面只能写一个表达式,不能写多行复杂语句。
可以写:
不可以写:
也不适合写很复杂的逻辑。
如果逻辑比较复杂,应该使用 def:
lambda 最常见的用法不是单独使用,而是和一些函数搭配使用。
常见搭配包括:
sorted() 可以对数据进行排序。
当我们想指定排序规则时,经常会用到 lambda。
输出结果:
这是普通排序。
现在有一个学生列表:
{"name": "小明", "score": 85}, {"name": "小红", "score": 92}, {"name": "小刚", "score": 78}如果想按照成绩排序,可以写:
{"name": "小明", "score": 85}, {"name": "小红", "score": 92}, {"name": "小刚", "score": 78}result = sorted(students, key=lambda student: student["score"])解释:
lambda student: student["score"] 表示取出每个学生的 score 作为排序依据。如果要从高到低排序:
result = sorted(students, key=lambda student: student["score"], reverse=True)words = ["python", "java", "c", "javascript"]result = sorted(words, key=lambda word: len(word))输出结果:
['c', 'java', 'python', 'javascript']解释:
map() 可以把同一个操作应用到一组数据中的每一个元素。
通俗地说:
示例:把每个数字变成它的 2 倍。
result = map(lambda x: x * 2, numbers)输出结果:
解释:
lambda x: x * 2 表示把每个元素乘以 2。map 会把这个操作应用到 numbers 的每一个元素上。也可以用 for 循环写:
初学阶段可以先理解 for 循环,再理解 map()。
filter() 可以从一组数据中筛选出符合条件的元素。
通俗地说:
示例:筛选偶数。
numbers = [1, 2, 3, 4, 5, 6]result = filter(lambda x: x % 2 == 0, numbers)输出结果:
解释:
lambda x: x % 2 == 0 表示判断 x 是否是偶数。filter 会保留判断结果为 True 的元素。也可以用 for 循环写:
numbers = [1, 2, 3, 4, 5, 6]初学者先掌握 for 循环写法,再学习 lambda + filter,会更容易理解。很多 map()、filter() 搭配 lambda 的写法,也可以用列表推导式完成。
示例:把每个数乘以 2。
lambda + map 写法:
result = list(map(lambda x: x * 2, numbers))列表推导式写法:
result = [x * 2for x in numbers]示例:筛选偶数。
lambda + filter 写法:
numbers = [1, 2, 3, 4, 5, 6]result = list(filter(lambda x: x % 2 == 0, numbers))列表推导式写法:
numbers = [1, 2, 3, 4, 5, 6]result = [x for x in numbers if x % 2 == 0]lambda 很适合和 sorted 的 key 参数搭配。map 和 filter 也能用 lambda,但很多时候列表推导式更直观。lambda 的优点主要有:
3. 常用于 sorted、map、filter 等函数的参数示例:
{"name": "小明", "score": 85}, {"name": "小红", "score": 92}students = sorted(students, key=lambda student: student["score"])如果不用 lambda,就要单独定义函数:
students = sorted(students, key=get_score)两种写法都可以。
如果取值逻辑很简单,使用 lambda 会比较方便。
lambda 也有缺点:
不推荐写法:
result = sorted(students, key=lambda s: (s["class"], -s["score"], len(s["name"])))这种写法虽然可以运行,但对初学者来说不太容易看懂。
更清楚的写法:
return student["class"], -student["score"], len(student["name"])result = sorted(students, key=sort_rule)正确写法:
错误写法:
错误写法:
add = lambda a, b: return a + b正确写法:
适合:
不适合:
复杂逻辑应该使用 def。
4. 不要为了使用 lambda 而使用 lambda如果普通函数更清楚,就使用普通函数。
不太推荐:
check_score = lambda score: "优秀"if score >= 90else"及格"if score >= 60else"不及格"更清楚:
最常见写法:
sorted(students, key=lambda student: student["score"])这里的 lambda 不是单独使用,而是作为 key 参数传给 sorted()。
lambda 创建出来的对象也是函数。
示例:
输出结果中可以看到它是函数类型。
不太清楚:
sorted(students, key=lambda x: x["score"])sorted(students, key=lambda student: student["score"])虽然两种写法都能运行,但第二种更容易理解。
输出结果:
讲解重点:
lambda x: x * x 表示接收 x,返回 x 的平方。输出结果:
get_max = lambda a, b: a if a > b else b输出结果:
讲解重点:
{"name": "小明", "score": 85}, {"name": "小红", "score": 92}, {"name": "小刚", "score": 78}result = sorted(students, key=lambda student: student["score"], reverse=True)讲解重点:
lambda student: student["score"] 表示按 score 排序。numbers = [1, 2, 3, 4, 5, 6]result = list(filter(lambda x: x % 2 == 0, numbers))输出结果:
result = list(map(lambda x: x * 10, numbers))输出结果:
要求:定义一个 lambda 函数,传入一个数字,返回它的平方。
参考代码:
要求:传入一个数字,如果是偶数返回 True,否则返回 False。
参考代码:
is_even = lambda x: x % 2 == 0要求:按照年龄从小到大排序。
参考代码:
{"name": "小明", "age": 18}, {"name": "小红", "age": 16}, {"name": "小刚", "age": 17}result = sorted(students, key=lambda student: student["age"])要求:从成绩列表中筛选出及格成绩。
参考代码:
scores = [45, 70, 88, 59, 100]result = list(filter(lambda score: score >= 60, scores))要求:把姓名列表转换成对应的长度列表。
参考代码:
names = ["小明", "小红红", "张三"]result = list(map(lambda name: len(name), names))讲解 lambda 匿名函数时,可以按照下面顺序:
6. 重点讲 sorted(key=lambda ...)如果排序时只想临时指定一个规则,能不能直接写一个小函数?重点建议放在:
lambda 是 Python 中用来定义匿名函数的关键字。
基本格式:
可以这样记:
lambda 的特点:
lambda 常见使用场景:
需要注意:
一句话总结:
lambda 匿名函数适合写简单、临时的小功能,尤其适合配合 sorted、map、filter 等函数使用。