在Python中,匿名函数(也称为lambda函数)是使用lambda
关键字定义的小型匿名函数。它们主要用于需要一个函数作为参数的简单函数式编程场景,如map()
, filter()
, reduce()
等函数。
目录
一、Lambda函数的定义
Lambda函数的定义语法如下:
lambda arguments: expression
arguments:
是函数的参数列表,与正常函数定义类似,但不需要括号。expression:
是一个表达式,它会被计算并返回结果。这个表达式不能包含复杂的语句,如for
循环或if
语句(虽然可以使用三元运算符)。
二、Lambda函数的用途
Lambda函数主要用于简单的、一行的函数定义,它们通常用于:
- 在不需要多次调用的小范围内快速定义函数。
- 作为参数传递给其他函数(如
map()
,filter()
,reduce()
等)。
敲黑板:怎么理解“作为参数传递给其他函数”?看如下示例。
# 定义一个接受一个函数和一个列表作为参数的函数 def apply_function_to_list(func, list_to_apply): """ 将一个给定的函数应用到列表中的每个元素,并返回一个新的列表。 参数: func (callable): 需要应用到列表每个元素的函数。 list_to_apply (list): 需要应用函数的列表。 返回: list: 包含将函数应用到每个元素后结果的新列表。 """ # 使用列表推导式遍历 list_to_apply 中的每一个元素 item # 对每个 item 应用 func 函数,并将结果收集到一个新的列表中 return [func(item) for item in list_to_apply] # 使用 lambda 函数(匿名函数)作为参数 # 这个 lambda 函数接受一个参数 x,并返回 x 的两倍 # 将这个 lambda 函数和列表 [1, 2, 3, 4, 5] 作为参数传递给 # apply_function_to_list 函数 result = apply_function_to_list(lambda x: x * 2, [1, 2, 3, 4, 5]) # 打印结果,应输出: [2, 4, 6, 8, 10] print(result)
匿名函数的主要优点是它们的简洁性和灵活性。它们允许你快速定义一个小的函数片段,而无需为其命名或创建完整的函数定义。这使得它们特别适用于需要快速定义简单函数并将其作为参数传递的场景。
三、举例说明
1、计算两个数的和:
#正常的加法函数可能是这样子的
def add(x, y):
return x + y
result = add(5, 3) #调用,用结果为 8
# 匿名函数
add = lambda x, y: x + y
result = add(5, 3) #调用匿名函数,用结果为 8
#这里,lambda x, y: x + y 就是一个匿名函数,它接受两个参数 x 和 y,然后返回它们的和。
#我们可以直接将这个匿名函数赋值给一个变量add,然后就可以像普通函数一样使用它了。
2、筛选列表中的偶数:
# 创建一个包含整数的列表
numbers = [1, 2, 3, 4, 5, 6]
# 使用 filter 函数和 lambda 匿名函数从 numbers 列表中筛选出偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
# 输出结果应为 [2, 4, 6],即 numbers 列表中的偶数
print(even_numbers) # 输出: [2, 4, 6]
- filter 函数接受两个参数:第一个参数是一个函数,第二个参数是一个可迭代对象(例如列表)
- filter 函数会遍历可迭代对象中的每一个元素,并将这些元素作为参数传递给第一个函数
- 如果第一个函数对某个元素返回 True,则 filter 会“保留”这个元素;如果返回 False,则不会保留
- filter 函数的结果是一个迭代器,所以我们需要使用 list 函数将其转换为列表
3、将列表中的每个元素平方:
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers)) # 结果为 [1, 4, 9, 16, 25]
map
是 Python 的内置函数,它接受两个参数:第一个参数是一个函数,第二个参数是一个可迭代对象(如列表、元组等)。map
函数会遍历numbers
列表中的每一个元素,并将这些元素作为参数传递给lambda
函数。lambda
函数会对每个元素进行平方运算,然后map
函数返回一个新的迭代器,该迭代器包含了numbers
列表中每个元素的平方。map
函数的结果是一个迭代器,所以我们需要使用 list 函数将其转换为列表
4、对列表进行排序,按照字符串长度:
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=lambda word: len(word)) # 结果为 ['date', 'apple', 'cherry', 'banana']
sorted
函数是 Python 的内置函数,用于对可迭代对象(如列表、元组等)进行排序。它返回一个新的已排序的列表,而原始列表保持不变。sorted
函数有一个key
参数,该参数接受一个函数作为值。这个函数应用于输入列表中的每个元素,并返回一个用于排序的值。在这个例子中,我们使用了lambda
表达式来定义一个匿名函数,该函数接受一个单词作为输入,并返回该单词的长度(即len(word)
)。- 最后,
sorted
函数会根据这些长度值对单词进行排序。
四、Lambda函数与传统定义函数的对比
1、Lambda函数:
- 适用于简单的、一行的函数定义。
- 匿名,适合用于一些临时性的操作。
- 主要用于函数式编程场景。
题外话:常见的内置高阶函数
map()
:对可迭代对象中的每一个元素应用一个函数,并返回一个新的迭代器,其中包含应用函数后的结果。filter()
:对可迭代对象中的每一个元素进行判断,返回一个迭代器,其中包含使函数返回True的元素。reduce()
:对可迭代对象的元素进行累积操作,即函数对序列的第一个和第二个元素执行操作,然后用结果和第三个元素执行操作,依此类推。sorted()
:对可迭代对象进行排序,并返回一个新的已排序的列表。
2、传统定义函数:
- 适用于复杂的、多行的函数定义。
- 命名明确,可以多次调用。
- 适用于多种编程场景。
3、注意事项
- 尽量避免在复杂逻辑中使用Lambda函数,因为这会降低代码的可读性。
- 当Lambda函数变得复杂时,考虑使用传统定义函数的方式。
- Lambda函数主要用于短小的、一次性的函数定义,如回调函数等。