Python中函数的高级特性:闭包函数和匿名函数
Python中函数的高级特性有很多,本文将着重介绍两个:闭包函数和匿名函数。
闭包函数
闭包函数指的是,函数内部定义了一个函数,并且这个内部函数可以访问外部函数的变量,即使外部函数已经执行完毕,内部函数依然能够访问外部函数的变量。这种内部函数和外部函数之间的关系被称为“闭包”。
闭包函数的定义如下:
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
在上面的例子中,outer_function是外部函数,inner_function是内部函数。在inner_function内部,可以访问外部函数的变量x。如果我们调用outer_function(1),则会返回一个inner_function的对象。这个对象可以被赋值给一个变量,比如f,然后我们就可以通过f(2)来调用inner_function,得到结果3。
闭包函数的一个重要应用是,可以用来实现柯里化(currying)。
柯里化指的是,将一个带有多个参数的函数转换成多个带有一个参数的函数的过程。比如,我们有一个函数:
def add(x, y):
return x + y
通过柯里化,我们可以将add函数转换成以下三个函数:
def add(x):
def inner_function(y):
return x + y
return inner_function
add2 = add(2)
add3 = add(3)
print(add2(4)) # 6
print(add3(4)) # 7
在上面的例子中,我们通过闭包函数实现了柯里化。add(2)返回一个函数,这个函数会将传入的参数和2相加;add(3)也返回一个函数,这个函数会将传入的参数和3相加。这样我们就可以分别使用add2和add3这两个函数,分别进行加法操作,而不需要每次都传入两个参数了。
匿名函数
匿名函数指的是,没有名称的函数,这种函数在Python中被称为lambda函数。和普通函数不同,lambda函数只能包含一个表达式,这个表达式的结果就是这个函数的返回值。
lambda函数的定义如下:
lambda argument: expression
在上面的定义中,argument是lambda函数的参数,expression是这个函数的表达式。
比如,我们可以定义两个lambda函数:
add = lambda x, y: x + y multiply = lambda x, y, z: x * y * z print(add(2, 3)) # 5 print(multiply(2, 3, 4)) # 24
在上面的例子中,我们定义了两个lambda函数,一个是用来进行加法操作的add函数,一个是用来进行乘法操作的multiply函数。可以看到,我们可以像普通函数一样调用这些匿名函数。
匿名函数的一个重要应用是,可以用来作为高阶函数的参数。比如,我们可以使用Python的内置函数sorted来对一个列表进行排序,这个函数的第二个参数是一个key函数,用来指定排序的关键字:
my_list = [(1, 4), (2, 3), (3, 2), (4, 1)] sorted_list = sorted(my_list, key=lambda x: x[1]) print(sorted_list) # [(4, 1), (3, 2), (2, 3), (1, 4)]
在上面的例子中,我们使用lambda函数作为sorted函数的key参数,指定了按照元组的第二个元素进行排序。
