Python 闭包和装饰器

1. 闭包

a. 闭包的条件

在Python中创建闭包必须满足的条件:

  • 我们必须有一个嵌套函数(函数在函数内部)。
  • 嵌套函数必须引用在封闭函数中定义的值。
  • 封闭函数必须返回嵌套函数。

b. 何时使用闭包?

闭包可以避免使用全局值,并提供某种形式的数据隐藏。它还可以为该问题提供面向对象的解决方案。

当在一个类中实现的方法很少(大多数情况下是一个方法)时,闭包可以提供另一种更优雅的解决方案。但是,当属性和方法的数量变大时,最好实现一个类。

def f(x):
    def g(y):
        return x + y
    return g  # Return a closure.

def h(x):
    return lambda y: x + y  # Return a closure.

# Assigning specific closures to variables.
a = f(1)
b = h(1)

# Using the closures stored in variables.
assert a(5) == 6
assert b(5) == 6

# Using closures without binding them to variables first.
assert f(1)(5) == 6  # f(1) is the closure.
assert h(1)(5) == 6  # h(1) is the closure.

2. 装饰器

from time import time, sleep


def runtime(f):
    def inner(*args, **kwargs):
        print(f'-- Function {f.__name__} start ...')
        t = time()
        result = f(*args, **kwargs)
        print(f'-- Function {f.__name__} end. (Runtime: {time() - t:.3f} seconds)\n')
        return result

    return inner


@runtime
def func():
    sleep(2)


if __name__ == '__main__':
    func()

Output

-- Function func start ...
-- Function func end. (Runtime: 2.000 seconds)

参考资料:

[1] https://www.cainiaojc.com/python/python-closure.html

[2] https://en.wikipedia.org/wiki/Closure_(computer_programming)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值