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

Python函数中的闭包和装饰器详解

发布时间:2023-07-01 15:07:08

闭包和装饰器是Python中非常重要的概念,它们可以提高代码的复用性和可读性。本文将详细介绍Python函数中的闭包和装饰器。

1. 闭包

闭包是指在函数内部定义的函数,并且这个内部函数使用了外部函数的变量。换句话说,闭包是一个函数和与其相关的引用环境的组合。闭包有以下几个特点:

- 闭包函数可以访问外部函数的变量,即使外部函数已经执行结束;

- 外部函数的变量对于闭包函数来说是可读可写的,闭包函数可以修改外部函数的变量;

- 闭包函数可以访问其他闭包函数的变量。

下面是一个闭包的例子:

def outer_func(x):
    def inner_func(y):
        return x + y
    return inner_func

closure = outer_func(10)
print(closure(5))  # 输出 15

在这个例子中,outer_func是外部函数,inner_func是内部函数。inner_func使用了外部函数 outer_func 的变量 xouter_func(10)返回了 inner_func,并且保留了 x 的值。所以 closure 即为 inner_func,可以通过 closure(5) 来计算 10 + 5

2. 装饰器

装饰器是用来装饰其他函数的函数。它可以在不修改被装饰函数代码的前提下,为被装饰函数添加额外的功能。装饰器有以下几个特点:

- 装饰器是一个函数,它接受被装饰函数作为输入,然后返回一个新的函数,该新函数包含了被装饰函数的功能以及额外的功能。

- 被装饰函数的原始名称和文档字符串等属性会丢失,可以使用 functools.wraps 装饰器来解决这个问题。

下面是一个装饰器的例子:

import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("装饰器的额外功能")
        return func(*args, **kwargs)
    return wrapper

@decorator
def target_func():
    print("被装饰函数")

target_func()

在这个例子中,decorator 是装饰器函数,它接受一个函数参数 funcdecorator 内部定义了一个新的函数 wrapper,它接受任意位置参数 *args 和任意关键字参数 **kwargswrapper 在打印 "装饰器的额外功能" 之后,调用了原始的被装饰函数 func

使用装饰器 @decorator 可以直接将 target_func 装饰起来,使得 target_func 具有了 decorator 的额外功能。在执行 target_func() 时,会先打印 "装饰器的额外功能",然后再执行原始的被装饰函数。

总结:

- 闭包是通过内部函数引用外部函数变量而形成的一个整体;

- 装饰器是用来装饰其他函数的函数,可以为被装饰函数添加额外的功能。