python 闭包详解

在Python中,闭包是由另外一个函数返回的函数。它们不仅能够返回函数作为结果,还能够捕获并携带一些非局部变量的状态。闭包允许你绑定变量到函数,即使这个函数在它的作用域之外被调用,它仍然能够访问那些变量。

为了构成闭包,需要满足以下三个条件:

  1. 必须有一个内嵌函数(函数A内部定义的函数B)。
  2. 内嵌函数必须引用外部函数中声明的一个变量。
  3. 外部函数必须返回内嵌函数。

下面是一个闭包的例子:

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

# 乘以3的函数
times3 = make_multiplier_of(3)

# 乘以5的函数
times5 = make_multiplier_of(5)

print(times3(9))  # 输出: 27
print(times5(3))  # 输出: 15
print(times3(times5(2)))  # 输出: 30

在这个例子中,make_multiplier_of 函数创建并返回了一个叫做 multiplier 的内嵌函数。这个内嵌函数 multiplier 是一个闭包,因为它捕获了从外部函数 make_multiplier_of 的参数 n 的值。

make_multiplier_of(3) 被调用时,它返回了一个函数 multiplier,这个函数记住了 n 等于 3。这个返回的函数被存储在 times3 变量中。

闭包的一个重要特性是它记住了自己被创建时的环境。因此,即使函数在创建它的作用域之外被调用,闭包仍然能够访问非局部变量。

闭包的用途

闭包的用途非常广泛,常见的包括:

  • 用作回调函数,例如在异步编程中。
  • 封装私有数据,可以类似于OOP中的对象和方法。
  • 使用函数工厂创建特定行为的函数。

注意事项

  • 在使用闭包时要注意的一个陷阱是循环中创建闭包。如果在循环中创建闭包,那么闭包可能会捕获到循环的最后一个值。
  • 由于闭包可以捕获并持有外部作用域的变量,因此这些变量并不会像通常在函数退出时那样被垃圾回收器回收。这可能会导致一些意想不到的内存管理问题。

闭包与装饰器

Python中的装饰器就是一个使用闭包的很好例子。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。装饰器可以用来修改或增强原来函数的行为。

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

def say_hello():
    print("Hello!")

# 将装饰器应用于函数
say_hello_decorated = my_decorator(say_hello)

say_hello_decorated()

在上面的例子中,my_decorator 就是一个装饰器,它接受一个函数 say_hello 并返回了一个新的函数 wrapper。这个新的函数在 say_hello 函数调用前后添加了额外的打印输出。这个 wrapper 函数就是一个闭包,它能够记住并访问 say_hello 函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值