1、闭包

闭包是指一个函数内嵌套另一个函数,并且这个嵌套的函数引用了外层函数的变量。
闭包的作用是可以访问外层函数的变量,并且在函数内部修改变量的值。

代码语言:javascript

AI代码解释

def make_adder(n):
    def adder(x):
        return x + n
    return adder

add_three = make_adder(3)
print(add_three(4))  # 7

2、装饰器

装饰器是一种特殊的函数,它可以用来修改另一个函数的行为。
装饰器的语法如下:

代码语言:javascript

AI代码解释

# @装饰器函数
# def 函数名():
#     函数体
装饰器函数的作用是接收被装饰的函数作为参数,并返回一个修改后的函数。
装饰器函数可以做很多事情,比如:
  1. 记录日志 2. 性能测试 3. 事务处理 4. 缓存 5. 权限校验 6. 异常处理 7. 等等
举个例子:

代码语言:javascript

AI代码解释

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with {args}, {kwargs}")
        return func(*args, **kwargs)
    return wrapper

'''
log 是一个装饰器函数,它接受一个函数 func 作为参数。
wrapper 是一个内部函数,它接受任意数量的位置参数 *args 和关键字参数 **kwargs。
在 wrapper 函数中,首先打印一条日志信息,显示正在调用的函数名称和传递的参数。
然后,wrapper 函数调用原始的 func 函数,并将结果返回。
log 函数返回 wrapper 函数。
'''

@log
def add(x, y):
    return x + y

'''
@log 是一个装饰器语法糖,它等价于 add = log(add)。
这意味着 add 函数被 log 装饰器包装,add 现在指向 wrapper 函数。
'''

print(add(2, 3))  # Calling add with (2, 3), {} 5

'''
当你调用 add(2, 3) 时,实际上调用的是 wrapper(2, 3)。
wrapper 函数首先打印日志信息:Calling add with (2, 3), {}。
然后,wrapper 函数调用原始的 add 函数:add(2, 3),并返回结果 5。
最后,print 函数输出结果:5。
'''

3、总结

闭包主要用于封装和保持状态,它允许函数访问外部函数的变量。
装饰器主要用于在不修改原函数代码的情况下,为函数增加额外的功能。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐