欢迎访问宙启技术站
智能推送

高阶函数及装饰器在Python中的应用

发布时间:2023-06-20 07:57:11

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中的两个最为核心的概念之一,通过对函数参数和返回值的操作,让程序变得更加灵活可控。在实际应用中,我们可以通过定义自己的装饰器和高阶函数,来实现更为复杂的业务逻辑操作。