在 Python 中,lambda 表达式是一种用于创建匿名函数(即没有名称的临时函数)的简洁语法。它的核心特点是简化小型函数的书写,通常用于需要函数作为参数的场景(如高阶函数 map
、filter
、sorted
等),或者逻辑简单的函数式编程。
lambda 参数列表: 表达式
• 参数列表:类似普通函数的参数,可以包含多个参数(用逗号分隔),甚至无参数。
• 表达式:只能有一个表达式(不可包含语句如 if-else
代码块、循环等),其计算结果即为返回值。
# 普通函数定义
def add(x, y):
return x + y
# 等效的 lambda 表达式
add_lambda = lambda x, y: x + y
print(add(2, 3)) # 输出 5
print(add_lambda(2, 3)) # 输出 5
# 结合 map 对列表元素平方
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 输出 [1, 4, 9, 16]
# 结合 filter 筛选偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出 [2, 4]
key
函数# 按元组的第二个元素排序
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs) # 输出 [(1, 'one'), (3, 'three'), (2, 'two')]
# 条件判断(返回两个数中的较大值)
max_value = lambda a, b: a if a > b else b
print(max_value(5, 8)) # 输出 8
特性 | lambda 表达式 | 普通函数 (def) |
---|---|---|
名称 | 匿名(无函数名) | 有函数名 |
代码复杂度 | 仅限单个表达式,无语句(如循环、赋值) | 可包含任意复杂代码块 |
可读性 | 适合简单逻辑 | 适合复杂逻辑 |
复用性 | 通常一次性使用 | 可重复调用 |
避免滥用:复杂逻辑应使用 def
定义普通函数,保证代码可读性。
变量作用域:lambda 中的变量遵循词法作用域,但在循环中可能因延迟绑定导致意外结果(需显式传递变量)。
# 错误示例:循环中的 lambda 延迟绑定
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs]) # 输出 [2, 2, 2](非预期的 0,1,2)
# 修正:显式绑定当前 i 值
funcs = [lambda x=i: x for i in range(3)]
print([f() for f in funcs]) # 输出 [0, 1, 2]
限制性:无法包含 return
、try-except
等语句,也无法添加文档字符串。
lambda 表达式是 Python 函数式编程的重要工具,适合简化一次性的小型函数逻辑。合理使用能让代码更简洁,但需注意其局限性,避免牺牲可读性。在需要复用或复杂逻辑时,优先选择 def
定义普通函数。
在 Python 中,map
和 filter
是两个常用的高阶函数(接受函数作为参数的函数),它们与 lambda
表达式结合使用时尤其强大。以下是它们的详细解释和对比:
map
函数对可迭代对象(如列表、元组)中的每个元素应用指定的函数,返回一个新的迭代器(Python 3 中返回 map
对象,需转换为列表)。
map(function, iterable, ...)
• function
:要应用的函数(可以是 lambda
或普通函数)。
• iterable
:一个或多个可迭代对象(当有多个时,按最短的迭代器长度处理)。
numbers = [1, 2, 3, 4]
squared = map(lambda x: x**2, numbers)
print(list(squared)) # 输出 [1, 4, 9, 16]
a = [1, 2, 3]
b = [4, 5, 6]
sum_list = map(lambda x, y: x + y, a, b)
print(list(sum_list)) # 输出 [5, 7, 9]
def to_upper(s):
return s.upper()
words = ["apple", "banana", "cherry"]
upper_words = map(to_upper, words)
print(list(upper_words)) # 输出 ['APPLE', 'BANANA', 'CHERRY']
filter
函数根据指定函数的返回值(True
/False
),筛选可迭代对象中符合条件的元素,返回一个迭代器(Python 3 中返回 filter
对象)。
filter(function, iterable)
• function
:返回布尔值的函数(若为 None
,直接筛选 True
的元素)。
• iterable
:一个可迭代对象。
numbers = [1, 2, 3, 4, 5]
even = filter(lambda x: x % 2 == 0, numbers)
print(list(even)) # 输出 [2, 4]
words = ["hello", "", "world", None, " "]
non_empty = filter(lambda s: s and s.strip(), words)
print(list(non_empty)) # 输出 ['hello', 'world', ' ']
def is_positive(n):
return n > 0
values = [-5, 3, -2, 8]
positives = filter(is_positive, values)
print(list(positives)) # 输出 [3, 8]
map
和 filter
特性 | map |
filter |
---|---|---|
目的 | 对元素进行转换或计算 | 根据条件筛选元素 |
返回值 | 返回处理后的结果迭代器 | 返回符合条件的元素迭代器 |
函数要求 | 函数可返回任意类型 | 函数必须返回布尔值(True /False ) |
输入输出 | 输入与输出元素数量相同 | 输出元素数量 ≤ 输入数量 |
map
和 filter
可以用列表推导式替代:
• map
→ [func(x) for x in iterable]
• filter
→ [x for x in iterable if condition]
• 当逻辑简单且需要链式操作时,map
/filter
更简洁(如 map(func1, filter(func2, data))
)。
• 当逻辑复杂或需要多行处理时,列表推导式更易读。
map
和 filter
返回的是迭代器,直接打印会显示对象地址,需用 list()
转换为列表。map
/filter
可能稍快(惰性计算)。• map
:适合对每个元素进行统一处理(如数学运算、类型转换)。
• filter
:适合根据条件过滤元素(如筛选有效数据)。
• 结合 lambda
表达式可简化代码,但需注意可读性。