1.高阶函数概述
在Python中,函数是一等公民,是指函数像其他算子一样,可以作为变量的值赋给其他变量,可以作为参数传递给其他函数,也可以作为其他函数的返回值。而高阶函数是以函数作为参数或返回值的函数,它可以减少代码量,提高代码的可读性和灵活性。
1.1 map函数
map函数是Python自带的高阶函数,它接收一个函数和一个可迭代对象作为参数,将函数应用于每个元素并返回一个新的可迭代对象。
# 将列表中的所有元素乘以2
def double_num(x):
return 2*x
lst = [1, 2, 3, 4, 5]
res = map(double_num, lst)
print(list(res)) # [2, 4, 6, 8, 10]
在上述代码中,我们定义了一个double_num函数,将参数乘以2,并将该函数作为参数传递给map函数,最终得到一个新的列表 [2, 4, 6, 8, 10]。
1.2 filter函数
filter函数也是Python自带的高阶函数,接收一个函数和一个可迭代对象作为参数,返回所有使得函数返回值为True的元素组成的迭代器。
# 保留列表中的所有偶数
def is_even(x):
return x % 2 == 0
lst = [1, 2, 3, 4, 5]
res = filter(is_even, lst)
print(list(res)) # [2, 4]
在上述代码中,我们定义了一个is_even函数,当参数为偶数时返回True,将该函数作为参数传递给filter函数,最终得到一个新的列表 [2, 4]。
1.3 reduce函数
reduce函数是Python自带的高阶函数,需要从functools模块中导入。它接收一个函数和一个可迭代对象作为参数,对可迭代对象中的元素进行迭代计算,将结果与下一个元素继续进行计算,返回最终的计算结果。
# 计算列表中所有元素的乘积
from functools import reduce
def multiply(x, y):
return x * y
lst = [1, 2, 3, 4, 5]
res = reduce(multiply, lst)
print(res) # 120
在上述代码中,我们定义了一个multiply函数,将两个参数相乘,将该函数作为参数传递给reduce函数,最终得到列表中所有元素的乘积120。
2.lambda函数
lambda函数也称为匿名函数,它是一种简单的、一次性的函数定义方式。lambda函数的语法为lambda参数列表:函数体,其中参数列表和函数体与普通函数定义方式相同。
lambda函数通常作为高阶函数的参数使用,可以避免定义冗长的函数并在使用后丢弃。
# 使用lambda函数代替高阶函数的参数
lst = [1, 2, 3, 4, 5]
res = map(lambda x: 2*x, lst)
print(list(res)) # [2, 4, 6, 8, 10]
3.装饰器
装饰器是Python中用于修改或增强函数定义的语法结构。装饰器通常用于在不修改原函数定义的情况下增加新的功能,比如日志记录、用户认证、性能分析等。
3.1 基本装饰器
最简单的装饰器是将一个函数包裹在另一个函数中,并在其中调用原函数实现功能的增强。以下示例定义了一个装饰器,它在函数被调用前打印一条日志。
# 定义装饰器函数
def log(func):
def wrapper(*args, **kw):
print(f'calling function {func.__name__} with args {args} and kw {kw}')
return func(*args, **kw)
return wrapper
# 使用装饰器修饰函数
@log
def my_func(x):
return x
res = my_func(1)
print(res) # 1
在上述代码中,我们定义了一个log装饰器,它接收一个函数作为参数,返回一个新的函数wrapper。wrapper函数打印日志,并调用原函数func获取返回值。使用@语法将装饰器应用于my_func函数,即my_func = log(my_func)。
3.2 带参数的装饰器
装饰器函数可以接收参数,向装饰器中传递参数可以通过在@语法中写上参数,比如@decorator(args)。
# 定义带参数的装饰器函数
def log(level):
def decorator(func):
def wrapper(*args, **kw):
print(f'[{level}] calling function {func.__name__} with args {args} and kw {kw}')
return func(*args, **kw)
return wrapper
return decorator
# 使用装饰器修饰函数
@log(level='INFO')
def my_func(x):
return x
res = my_func(1)
print(res) # 1
在上述代码中,我们定义了一个带参数的log装饰器,它接收一个level参数,返回一个decorator函数。decorator函数接收一个函数作为参数,返回一个wrapper函数。wrapper函数打印日志,并调用原函数func获取返回值。使用@语法将装饰器应用于my_func函数,并将level参数传递给装饰器。
4.partial函数
partial函数是一个返回新函数的、带参数的高阶函数。它可以将一个函数的部分参数进行固定,并返回一个新函数,新函数可以再接收其他参数,并将固定的参数和新的参数一起传递给原函数。
# 使用partial函数将函数的部分参数固定
from functools import partial
def multiply(x, y):
return x * y
double = partial(multiply, y=2)
res = double(3)
print(res) # 6
在上述代码中,我们定义了一个multiply函数,将两个参数相乘。使用partial函数将函数的第二个参数固定为2,并返回一个新的函数double。调用新函数double时,将参数3和固定参数2一起传递给原函数multiply,最终得到返回值6。
5.总结
高阶函数是Python中非常有用的语法结构,可以大大简化代码并提高代码的可读性和灵活性。常见的高阶函数包括map、filter和reduce函数,可以让我们避免使用循环迭代操作。lambda函数是一种简单的函数定义方式,通常用于高阶函数的参数定义。装饰器是一种修改或增强函数定义的语法结构,可以增加函数的功能而不改变原函数定义。partial函数是一个返回新函数的高阶函数,可以将原函数的部分参数进行固定。