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