闭包与装饰器

闭包

  • 定义:在嵌套函数内使用非全局变量(非本层变量)就是闭包
def wrapper():
    a = 1
    def inner():
        return a
    return inner
ret = wrapper()
print(ret())
  • 这就是一个闭包,在此a就是一个自由变量,这里内层函数调用自由变量a=1,当函数消失,自由变量也会保留下来
  • print(ret.closure)#判断是不是闭包
    作用:
  1. 保证数据安全性
  2. 装饰器
    —————————————————假装分隔符—————————————
    装饰器
  • 装饰器应满足开放封闭原则
  • 在不改变源代码以及调用方式的基础下额外增加新的功能就是开放封闭原则
def warpper(f): #这里接受func内存地址,f是要被装饰的函数的函数名,f就是相当于闭包里面的自由变量
    def inner(*args,**kwargs):
        print("被装饰函数执行前")
        ret=f(*args,**kwargs)  #打印((1, 2, 3, 4), {'a': 1}),这里f也就是调用func函数体
        print("被装饰函数执行后")
        return ret  #返回func的return值,如果没有return就返回none,这一句必须加在最里面函数最后一行,加在前面则return后面语句完全不会执行
    return inner

#@warpper 要将语法糖放在被装饰的函数正上方
def func(*args,**kwargs):
    print(f"被装饰的{args,kwargs}")
    return "我是func函数"  #这里没有return返回none

func=warpper(func)  #把func传给f,并接受返回的inner内存地址
print(func(1,2,3,4,a=1))  #执行inner里面的函数体
  • 这是一个普通版装饰器
  • 小例题
def timeslong(func):  # 装饰器
    def call():
        start = time.clock()
        print("It's time starting ! ")
        func()
        print("It's time ending ! ")
        end = time.clock()
        return "It's used : %s ." % (end - start)
    return call

@timeslong
def f():  # 这是被装饰函数
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
    return y
print(f())
  • 装饰器的功能是,显示原函数的累加计算时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值