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

Python闭包函数和装饰器

发布时间:2023-06-24 12:17:54

Python是一种允许使用函数作为参数、返回值的语言,这种语言特性使得Python可以使用闭包函数和装饰器实现很多有趣的功能。

# 闭包函数

闭包函数是一种在函数内部定义函数,并且该内部函数可以访问外部函数的变量的函数。以下是一个示例:

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function
    
closure = outer_function(10)
print(closure(5))
# output: 15

在这个示例中,inner_function 访问了外部函数 outer_function 的变量 x,并且作为 outer_function 的返回值被赋值给了变量 closure。当调用 closure(5) 时,返回值为 15,因为 closure 所指向的函数 inner_function105 相加。

闭包函数的一个常用场景是在函数中定义回调函数,例如下面这个例子:

def make_multiplier(n):
    def multiplier(x):
        return x * n
    return multiplier

triple = make_multiplier(3)
print(triple(6))
# output: 18

在这个示例中,make_multiplier 函数返回一个内部函数 multiplier,该函数根据传入的参数 n 进行倍数计算。在应用中,我们可以使用 make_multiplier 来创建不同的乘数函数。

# 装饰器

装饰器是一种将一个函数作为参数,返回一个新函数的函数,新函数可能会对原函数进行修改或增强。最常见的装饰器使用 @decorator 的语法,如下所示:

@decorator
def my_function():
    pass

其等价于:

my_function = decorator(my_function)

以下是一个装饰器的示例:

def greet_decorator(function):
    def wrapper():
        print("Hello!")
        function()
        print("Goodbye!")
    return wrapper

@greet_decorator
def greet():
    print("How are you?")

greet()
# output: Hello!
#         How are you?
#         Goodbye!

在这个示例中,greet函数被 @greet_decorator 装饰。当我们调用 greet 函数时,会先输出"Hello!",接着运行 greet 函数的代码,最后输出"Goodbye!"。在这个过程中,由于 greet 函数被 greet_decorator 装饰,所以会在 greet 函数的代码执行之前和之后添加额外的代码。

装饰器有很多应用,例如代码计时、运行时检查和异常处理等。以下是一个装饰器的示例,用于记录函数的运行时间:

import time

def timeit(function):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = function(*args, **kwargs)
        end = time.time()
        print("{} took {:.3f} seconds.".format(function.__name__, end - start))
        return result
    return wrapper

@timeit
def some_long_function():
    time.sleep(2)

some_long_function()
# output: some_long_function took 2.002 seconds.

在这个示例中,@timeit 装饰器可以用于记录函数执行时间。由于 wrapper 函数接收任意数量和类型的参数,调用 function(*args, **kwargs) 来处理传入的参数,所以可以使用这个装饰器修饰带有任意参数的函数。

闭包函数和装饰器是Python函数式编程中比较重要的功能,通过使用这些功能可以提高代码的可读性和可维护性,也可以实现很多有用的功能。