lambda
2026/7/27约 1237 字
前面学了用 def 定义函数,接下来瞅瞅 Python 中的匿名函数——lambda。它适合写一些简单、临时的小函数,不用专门起名字。
1. 什么是 lambda
lambda 匿名函数。
lambda 函数是一种小型、匿名的、内联函数。它不需要像普通函数那样用 def 关键字定义,也没有函数名,通常一行就能写完。
lambda 函数可以接受任意数量的参数,但只能有一个表达式,表达式的结果会自动返回。
它常用于需要一个简单函数作为参数的场景,比如配合 map()、filter()、reduce() 等内置函数使用。
2. lambda 语法格式
lambda 参数: 表达式lambda是 Python 的关键字,用于定义匿名函数。参数是参数列表,可以没有,也可以有多个,多个参数用逗号,隔开。表达式是函数体,只能有一个表达式,计算结果会自动返回。
lambda 函数的特点:
- 匿名,没有函数名。
- 通常只有一行代码。
- 适合写简单的函数逻辑。
3. lambda 基础用法
3.1 无参数
如果没有参数,直接写 lambda: 即可。
f = lambda: 'Hello, world!'
# 输出: Hello, world!
print(f())3.2 单参数
x = lambda a: a + 10
# 输出: 15
print(x(5))这里 a 是参数,a + 10 是表达式,x(5) 调用时传入 5,返回 15。
3.3 多参数
# 两个参数
multiply = lambda a, b: a * b
# 输出: 30
print(multiply(5, 6))
print('--------------华丽的分割线--------------')
# 三个参数
add_three = lambda a, b, c: a + b + c
# 输出: 13
print(add_three(5, 6, 2))参数之间用逗号隔开,调用时按顺序传入即可。
4. lambda 与内置函数结合使用
lambda 经常和 map()、filter()、reduce() 一起使用,让代码更简洁。
4.1 map()
map() 会把函数依次作用于可迭代对象的每个元素,返回一个迭代器。
numbers = [1, 2, 3, 4, 5]
# 对列表每个元素求平方
squared = list(map(lambda x: x ** 2, numbers))
# 输出: [1, 4, 9, 16, 25]
print(squared)上面的代码等价于:
numbers = [1, 2, 3, 4, 5]
squared = []
for x in numbers:
squared.append(x ** 2)
# 输出: [1, 4, 9, 16, 25]
print(squared)4.2 filter()
filter() 会根据函数的返回值(True 或 False)过滤可迭代对象中的元素。
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
# 筛选出偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
# 输出: [2, 4, 6, 8]
print(even_numbers)lambda x: x % 2 == 0 返回一个布尔值,只有为 True 的元素才会被保留。
4.3 reduce()
reduce() 会对可迭代对象的元素进行累积计算,它需要从 functools 模块中导入。
from functools import reduce
numbers = [1, 2, 3, 4, 5]
# 计算累积乘积
product = reduce(lambda x, y: x * y, numbers)
# 输出: 120
print(product)执行过程是:
- 先计算
1 * 2 = 2 - 再计算
2 * 3 = 6 - 再计算
6 * 4 = 24 - 最后计算
24 * 5 = 120
reduce()在 Python 3 中不再是内置函数,需要手动导入。
5. 使用建议与注意事项
lambda 虽然简洁,但也不是到处都用才好。
5.1 适合的场景
- 函数逻辑非常简单,只有一行表达式。
- 只需要临时用一下,不想专门定义一个函数。
- 作为参数传递给
map()、filter()、sorted()等函数。
# 按字符串长度排序
words = ['apple', 'pie', 'banana', 'kiwi']
result = sorted(words, key=lambda x: len(x))
# 输出: ['pie', 'kiwi', 'apple', 'banana']
print(result)5.2 不适合的场景
- 函数逻辑复杂,包含多行代码。
- 需要写条件判断、循环、赋值语句等。
- 需要写文档字符串或被别人频繁复用。
这些情况建议用 def 定义普通函数,可读性更好。
# 不推荐:lambda 里写复杂逻辑
# func = lambda x: ...
# 推荐:用 def 定义
def get_grade(score):
if score >= 90:
return '优秀'
elif score >= 60:
return '及格'
else:
return '不及格'5.3 lambda 与普通函数的区别
| 特性 | lambda | def 函数 |
|---|---|---|
| 是否有函数名 | 没有 | 有 |
| 函数体 | 只能有一个表达式 | 可以有多行语句 |
| 是否自动返回 | 是 | 需要写 return |
| 适用场景 | 简单临时函数 | 复杂、可复用函数 |
6. lambda 练习
最后来几个小练习巩固一下。
6.1 按字符串长度排序
words = ['python', 'java', 'go', 'javascript']
result = sorted(words, key=lambda x: len(x))
# 输出: ['go', 'java', 'python', 'javascript']
print(result)6.2 过滤大于指定值的元素
numbers = [10, 25, 3, 40, 8, 60]
result = list(filter(lambda x: x > 20, numbers))
# 输出: [25, 40, 60]
print(result)6.3 温度转换
celsius = [0, 10, 20, 30, 40]
# 摄氏温度转华氏温度
fahrenheit = list(map(lambda c: c * 9 / 5 + 32, celsius))
# 输出: [32.0, 50.0, 68.0, 86.0, 104.0]
print(fahrenheit)6.4 求列表中所有数的和
from functools import reduce
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = reduce(lambda x, y: x + y, numbers)
# 输出: 55
print(result)lambda 适合让简单逻辑更紧凑,但不要为了省行数硬把所有函数都改成 lambda。初学阶段优先保证代码能看懂,再追求简洁。