Python高阶函数:深入理解lambda表达式与闭包
在Python中,函数是一等对象,因此可以将函数作为参数传递给其他函数。高阶函数则是接受函数作为参数并/或返回函数的函数。
在高阶函数中,Lambda表达式和闭包是两种非常常见的概念。下面将深入探讨这两个概念的使用方法和应用。
Lambda表达式
Lambda表达式是一种匿名函数,通常用于在函数内部定义一个简单的函数。在Python中,Lambda表达式使用“lambda”关键字定义,语法如下:
lambda argument_list: expression
其中,argument_list是包含参数的逗号分隔列表,expression是该Lambda函数的返回值。例如,要编写一个计算平方的Lambda函数,可以使用以下代码:
square = lambda x: x ** 2
该Lambda函数接受一个参数x,并返回x的平方。使用该函数计算3的平方,则可以使用以下代码:
print(square(3)) # 输出结果:9
在高阶函数中,Lambda表达式通常用于定义过滤器、映射、排序等操作的功能。
过滤器
要使用Lambda表达式过滤序列中的项目,可以使用Python的内置函数“filter()”。该函数接受一个函数和一个序列作为参数,并返回一个新序列,其中只包含满足该函数要求的序列元素。以下代码演示了如何使用Lambda表达式过滤序列:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出结果:[2, 4, 6, 8, 10]
在该示例中,使用了Lambda表达式,该表达式检查一个数字是否为偶数。然后使用过滤器函数过滤序列中的奇数,并将结果存储在新的变量“even_numbers”中。
映射
要使用Lambda表达式将序列中的元素映射到相应的值,可以使用Python的内置函数“map()”。该函数接受一个函数和一个序列作为参数,并返回一个新序列,其中包含应用该函数的元素。例如,以下代码展示了如何使用Lambda表达式将序列中的每个元素加1:
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x + 1, numbers))
print(result) # 输出结果:[2, 3, 4, 5, 6]
在该示例中,Lambda函数接受一个数字,并返回该数字加1的结果。之后,使用映射函数将该Lambda函数应用于序列中的每个元素,并将结果存储在一个新变量“result”中。
排序
要使用Lambda表达式对序列进行排序,可以使用Python的内置函数“sorted()”。该函数接受一个序列和一个可选参数key,其中key是以Lambda函数形式传递的排序标准。例如,以下代码展示了如何使用Lambda表达式按逆序排序序列:
numbers = [5, 1, 3, 2, 4]
result= sorted(numbers, key=lambda x: -x)
print(result) # 输出结果:[5, 4, 3, 2, 1]
闭包
闭包是一个函数对象,该对象可以访问在定义函数时存在的某些变量,即使这些变量在函数调用时不再存在。在Python中,通过在函数中定义另一个函数来创建闭包,该函数可以访问外部函数的局部变量。以下是一个展示如何创建闭包的示例:
def outer_function(x):
def inner_function(y):
return x * y
return inner_function
multiply_by_2 = outer_function(2)
multiply_by_3 = outer_function(3)
print(multiply_by_2(4)) # 输出结果:8
print(multiply_by_3(4)) # 输出结果:12
在该示例中,inner_function是在outer_function中定义的,因此可以访问outer_function中的变量x。在返回inner_function时,outer_function的值已经消失,但是inner_function仍然可以访问它并执行计算。
闭包通常用于在函数之间共享状态或保留状态,以备将来使用。这使得可以设计和编写复杂的程序,而不必使用全局变量或类属性。
