背景:经常有 需要维护的代码 中嵌套Lambda 函数,个别地方不宜读懂。聊一下
Lambda 函数,也称为匿名函数,是一种用一行代码定义简单函数的方式。它省略了用 def 定义函数的标准步骤,没有函数名,只包含一个表达式(而非代码块),并返回这个表达式的结果。

它的存在是为了编写小型、一次性的、不需要重复使用的函数,让代码更简洁。

1基本语法
lambda arguments: expression
  • lambda: 定义 lambda 函数的关键字。
  • arguments: 函数的参数,可以有多个,用逗号分隔。与普通函数的参数定义方式相同。
  • expression: 一个单一的表达式。这个表达式的结果就是 lambda 函数的返回值。注意:不能是语句或代码块(如不能有 if...else... 语句,但可以使用三元表达式)
2 示例
def add(x, y):
    return x + y

print(add(2, 3))  # 输出 5
用 lambda 实现同样功能:
add_lambda = lambda x, y: x + y
print(add_lambda(2, 3))  # 输出 5
3 常用场景

Lambda 函数最常见的用途是作为参数传递给那些接受函数作为参数的高阶函数(Higher-order functions),尤其是在处理数据结构和函数式编程风格时。

3.1 与 sorted(), list.sort(), max(), min() 等结合:自定义排序或比较规则

这些函数都有一个 key 参数,它接受一个函数。这个函数会作用在序列的每一个元素上,并根据这个函数的返回结果进行排序或比较。

示例:按字符串长度排序

my_list = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# 使用普通函数
def get_length(s):
    return len(s)
sorted_list = sorted(my_list, key=get_length)
print(sorted_list)  # 输出: ['date', 'apple', 'banana', 'cherry', 'elderberry']

# 使用 lambda 函数 (更简洁,无需单独定义函数)
sorted_list_lambda = sorted(my_list, key=lambda s: len(s))
print(sorted_list_lambda)  # 输出: ['date', 'apple', 'banana', 'cherry', 'elderberry']

示例:按元组的第二个元素排序

list_of_tuples = [(1, 'c'), (3, 'a'), (2, 'b')]
sorted_list = sorted(list_of_tuples, key=lambda x: x[1]) # 按索引为1的元素(字符串)排序
print(sorted_list)  # 输出: [(3, 'a'), (2, 'b'), (1, 'c')]
3.2 与 filter() 结合:过滤序列

filter(function, iterable) 函数用来自过滤序列,过滤掉不符合条件的元素,返回一个迭代器。function 是一个判断函数,它返回 TrueFalse

示例:过滤出列表中的所有偶数

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用普通函数
def is_even(n):
    return n % 2 == 0
even_numbers = list(filter(is_even, numbers))
print(even_numbers)  # 输出: [2, 4, 6, 8, 10]

# 使用 lambda 函数
even_numbers_lambda = list(filter(lambda n: n % 2 == 0, numbers))
print(even_numbers_lambda)  # 输出: [2, 4, 6, 8, 10]
3.3 与 map() 结合:对序列中每个元素进行操作

map(function, iterable, ...) 函数会根据提供的函数对指定序列做映射,返回一个迭代器。

示例:将列表中的每个数字平方

numbers = [1, 2, 3, 4, 5]

# 使用普通函数
def square(n):
    return n * n
squared = list(map(square, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

# 使用 lambda 函数
squared_lambda = list(map(lambda n: n * n, numbers))
print(squared_lambda)  # 输出: [1, 4, 9, 16, 25]
3.4 在图形用户界面(GUI)编程中:作为回调函数

在 Tkinter 等 GUI 库中,按钮、菜单等控件的命令(command)经常绑定一个简单的函数。Lambda 在这里非常方便。

示例(Tkinter):

import tkinter as tk

root = tk.Tk()
button = tk.Button(root, text="Click Me!")

# 普通函数需要先定义,如果函数很简单会显得繁琐
def on_button_click():
    print("Button clicked!")

button.config(command=on_button_click)

# 使用 lambda 可以直接内联定义
button.config(command=lambda: print("Button clicked!"))

button.pack()
root.mainloop()

当按钮被点击时,lambda 函数会被调用。

注意事项和局限性

  1. 简洁至上:Lambda 函数应该非常简短,通常只包含一个表达式。如果逻辑复杂,请使用 def 定义普通函数。

  2. 可读性:不要过度使用 lambda。如果一个 lambda 函数难以理解,把它写成普通函数会更好。

  3. 只能有一个表达式:Lambda 函数体只能是一个表达式,不能包含复杂的逻辑或多条语句(if 语句、for 循环等都不行)。但可以使用三元表达式实现简单条件判断。

    # 使用三元表达式在 lambda 中实现条件判断
    get_type = lambda x: 'even' if x % 2 == 0 else 'odd'
    print(get_type(4))  # 输出 'even'
    print(get_type(3))  # 输出 'odd'
    
  4. 没有函数名__name__ 属性是 <lambda>,这在调试时可能不如有名字的函数方便。

总结

特性描述
本质匿名、一次性的小型函数
核心优势代码简洁,无需命名,尤其适合作为高阶函数的参数
最常见场景sorted(key=), filter(), map(), max()/min(key=) 以及 GUI 回调
黄金法则保持简单。如果逻辑超过一行,请使用 def

简单来说,把 lambda 想象成一种“函数字面量”,就像数字 5 或字符串 "hello" 一样,你可以直接在需要函数的地方“写”一个出来,而不必先把它“存”到一个变量里。这是函数式编程风格在 Python 中的一种体现

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐