源本科技 | 码上会

Python 匿名函数

2026/01/17
8
0

学习目标

  • 理解 Lambda 函数的基本语法与匿名特性

  • 掌握 Lambda 在条件判断、列表推导中的使用方法

  • 学会结合 filter()map()reduce() 使用 Lambda 进行数据处理

  • 能够区分 Lambda 与普通函数(def)的适用场景

  • 了解 Lambda 的局限性及其在函数式编程中的作用


什么是 Lambda 函数

Lambda 函数是匿名函数,即没有显式名称的函数。Python 使用 lambda 关键字定义这类轻量级函数,适用于简单、一次性使用的逻辑。

基本语法

lambda 参数: 表达式
  • lambda:定义匿名函数的关键字

  • 参数:可以有多个,用逗号分隔(如 x, y

  • 表达式:只能是一个表达式,其计算结果自动返回

注意:Lambda 函数不能包含语句(如 printreturn、赋值等),仅能包含一个表达式。

示例:字符串转大写

text = 'Hello Python'
to_upper = lambda s: s.upper()
print(to_upper(text))

输出:

HELLO PYTHON

此处 to_upper 是一个 Lambda 函数,接收字符串并返回其大写形式。


常见使用场景

1. 条件判断

三元表达式

Lambda 支持使用 if-else 实现条件逻辑,常用于分类或标签生成。

示例:判断正负零

classify = lambda x: "正数" if x > 0 else "负数" if x < 0 else "零"
print(classify(5))   # 正数
print(classify(-3))  # 负数
print(classify(0))   # 零

示例:判断奇偶

is_even = lambda n: "偶数" if n % 2 == 0 else "奇数"
print(is_even(4))  # 偶数
print(is_even(7))  # 奇数

这类写法简洁,适合在需要快速判断并返回标签的场景中使用。


2. 与列表推导结合

Lambda 可嵌入列表推导中,用于生成函数列表或延迟计算。

# 创建一个包含多个 Lambda 函数的列表
funcs = [lambda x=i: x * 10 for i in range(1, 5)]

for f in funcs:
    print(f())

输出:

10
20
30
40

注意:这里使用 x=i 捕获当前循环变量的值,避免闭包陷阱(否则所有函数都会返回 40)。


3. 返回多个结果

通过元组

虽然 Lambda 只能写一个表达式,但可通过元组返回多个值。

calc = lambda a, b: (a + b, a * b)
result = calc(3, 4)
print(result)  # (7, 12)

适用于需要同时返回多个计算结果的轻量场景。


4. 与 filter() 配合

筛选数据

filter(function, iterable) 保留使函数返回 True 的元素。

numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens))  # [2, 4, 6]

Lambda 作为过滤条件,简洁高效。


5. 与 map() 配合

转换数据

map(function, iterable) 对每个元素应用函数并返回新迭代器。

data = [1, 2, 3, 4]
doubled = map(lambda x: x * 2, data)
print(list(doubled))  # [2, 4, 6, 8]

常用于数据预处理、格式转换等任务。


6. 与 reduce() 配合

累积计算

reduce(function, iterable) 对序列进行累积操作(需从 functools 导入)。

from functools import reduce

nums = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, nums)
print(product)  # 24

执行过程:((1*2)*3)*4 = 24,适用于求和、连乘、拼接等聚合操作。


Lambda 与 def 函数的对比

特性

Lambda 函数

普通函数(def

定义方式

单行表达式

多行代码块

函数名

匿名(可赋值给变量)

必须有名称

语句支持

仅允许一个表达式

支持多条语句、循环、异常处理等

文档字符串

不支持 docstring

支持 """...""" 注释

适用场景

简短、临时、一次性逻辑

复杂、可复用、需调试的函数

功能等价示例

# 使用 Lambda
square = lambda x: x ** 2
print(square(3))  # 9

# 使用 def
def square_def(x):
    return x ** 2
print(square_def(3))  # 9

两者结果相同,但 def 更适合需要注释、调试或多步逻辑的场景。


重点总结

  • Lambda 是匿名、单表达式的函数,适合轻量级操作。

  • 常与 map()filter()reduce() 等函数式工具配合使用。

  • 虽然简洁,但不可滥用——复杂逻辑应使用 def 提高可读性。

  • Lambda 无法包含语句、不能加文档字符串,调试困难。

  • 在数据处理、回调函数、排序键等场景中非常实用。


思考题

  1. 为什么在列表推导中使用 lambda x=i: ... 而不是 lambda: i?如果不加 x=i 会发生什么?

  2. 尝试使用 Lambda 和 map() 将一个字符串列表全部转换为小写,并去除首尾空格。

  3. 在什么情况下应该避免使用 Lambda?请举例说明一个更适合用 def 实现的场景。