高阶函数及装饰器在Python中的应用
Python中的高阶函数及装饰器是非常强大和常用的概念。高阶函数通常指接收函数作为参数或将函数作为返回值的函数。装饰器则是Python中用于修饰函数或类的函数,可以在不改变函数本身代码的情况下,增加或改变原函数的功能。
高阶函数的应用:
1. Map( ) 函数
Map( ) 函数是高阶函数中最常用的一种。它接收两个参数, 个参数是一个函数,第二个参数是一个可迭代的对象。Map( ) 函数将传入的可迭代对象中的每个元素都依次传给 个参数即函数,然后将返回值结果收集到一个新的对象中并返回。例如:
def square(x):
return x**2
a = [1, 2, 3, 4, 5]
print(list(map(square, a)))
输出:
[1, 4, 9, 16, 25]
此时 map() 函数已经将 square() 函数作为参数传入,然后依次计算每个元素的平方,并将其组成一个新的列表,最后输出为 [1, 4, 9, 16, 25]。
2. Filter( ) 函数
filter() 函数是用于筛选一个 iterable 序列中的元素。该函数接收两个参数, 个是筛选函数,第二个是可迭代对象。筛选函数接收 iterable 序列中的每个值,返回 True 或 False,如果返回 True,则该元素被保留,否则被去除。例如:
def odd(x):
return x % 2 == 1
a = [1, 2, 3, 4, 5, 6, 7]
print(list(filter(odd, a)))
输出:
[1, 3, 5, 7]
此时 filter() 函数已经将 odd() 函数作为参数传入,依次对 iterable 序列中的每个元素,计算其取模后是否等于1,返回 True 或 False。然后将其组成一个新的列表,最后输出为 [1, 3, 5, 7]。
3. Reduce( ) 函数
reduce() 函数是用于对一个序列的所有元素进行累积操作的函数。该函数接收两个参数, 个是操作函数,第二个是可迭代对象。操作函数可以自定义,用于对 iterable 序列中的元素逐步进行计算,并返回最终的结果。例如:
from functools import reduce
def add(x, y):
return x + y
a = [1, 2, 3, 4, 5]
print(reduce(add, a))
输出:
15
此时 reduce() 函数已经将 add() 函数作为参数传入,依次对 iterable 序列中的每个元素进行相加操作,最后得到的值即为 15。
装饰器的应用:
1. 用来统计函数运行时间
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print("函数运行时间为:", end_time - start_time)
return res
return wrapper
此时在装饰想要进行统计的函数时,则可以这样调用:
@timer
def hello():
time.sleep(1)
print("Hello")
hello()
2. 用来检测函数参数类型
def typecheck(func):
def wrapper(*args, **kwargs):
#检查参数类型
type_dict=func.__annotations__
for i,arg in enumerate(args):
print(f'{func.__name__}参数{i+1}类型应该是{type_dict[list(type_dict.keys())[i]]}')
if type(arg) != type_dict[list(type_dict.keys())[i]]:
raise TypeError(f'{func.__name__}的参数{i+1}类型不是{type_dict[list(type_dict.keys())[i]]}')
# 传递给原始函数,调用真正的函数并返回结果
return func(*args,**kwargs)
return wrapper
此时在装饰想要进行类型检测的函数时,则可以这样调用:
@typecheck
def add(a: int, b: int) -> int:
return a + b
add(1, 2)
输出:
add参数1类型应该是<class 'int'> add参数2类型应该是<class 'int'>
如果参数类型不匹配,则会抛出错误信息。
装饰器和高阶函数是Python中的两个最为核心的概念之一,通过对函数参数和返回值的操作,让程序变得更加灵活可控。在实际应用中,我们可以通过定义自己的装饰器和高阶函数,来实现更为复杂的业务逻辑操作。
