Python函数编程:lambda表达式和闭包
Python 是一种支持函数式编程的面向对象语言,其中在编写函数式程序时的两个重要概念是 lambda 表达式和闭包。
lambda 表达式是一种匿名函数,可以将其放在定义它的位置处使用。它是一个简单的单行函数,没有函数名称。它的语法为:
lambda 参数: 片段代码
其中,参数是函数的形参,片段代码是函数的实现。例如:
square = lambda x: x**2
print(square(5)) # 输出 25
这里 square 是一个 lambda 函数,实现了对参数 x 进行平方计算的功能。lambda 表达式可以用于作为参数传递到其他函数中,例如:
list1 = [1, 2, 3, 4]
list2 = list(map(lambda x: x**2, list1))
print(list2) # 输出 [1, 4, 9, 16]
map 函数接收一个函数和一个可迭代对象作为参数,然后将这个函数对可迭代对象中的每个元素进行操作,最终返回一个新的可迭代对象。上述代码中,将 map 函数的第一个参数传入一个 lambda 函数,这个 lambda 函数对传入的参数进行平方运算,map 函数对可迭代对象 list1 中的每个元素进行平方运算,生成一个新的可迭代对象 list2。这个技巧可以在多个需要对同一个数据集进行相同处理的场景中使用。
闭包是一个包含多个函数和非全局变量的函数。它是在其他函数内部定义的,可以访问这个内部函数和非全局变量,通常用于保存状态,也可以作为其他函数的返回值。例如:
def outer_function():
x = 0
def inner_function():
nonlocal x
x += 1
return x
return inner_function
increment = outer_function()
print(increment()) # 输出 1
print(increment()) # 输出 2
这里 outer_function 定义了一个内部函数 inner_function,内部函数中访问了外部函数的变量 x。一个闭包的核心是在内部函数中定义了一个 nonlocal 变量,它使得内部函数可以修改外部函数的变量。outer_function 返回内部函数的引用,并将其赋值给变量 increment。然后我们调用 increment 函数两次,它分别输出 1 和 2。由于 inner_function 是一个闭包,它在两次调用时都可以访问 x 变量的状态。这个技巧可以用于实现局部存储,避免全局变量的使用。
在 Python 中,lambda 表达式和闭包可以相互组合使用,以实现更复杂的功能。
def multiplier(n):
return lambda x: x * n
double = multiplier(2)
triple = multiplier(3)
print(double(5)) # 输出 10
print(triple(5)) # 输出 15
这个例子中,multiplier 函数返回一个 lambda 表达式,它使用传入的参数 n 来生成另一个匿名函数,这个函数可以对它传入的 x 进行乘法运算。我们分别将 2 和 3 传递给 multiplier 函数,生成 double 和 triple 两个函数分别用于对输入的数字进行 2 倍和 3 倍运算。我们先调用 double(5),输出 10,然后再调用 triple(5),输出 15。这个技巧可以用于生成特定操作的函数,使得我们可以在多个地方使用这些函数。例如,有些用于数据清洗、数据处理、数据分析的函数,可以通过这种方式生成。
