闭包函数及装饰器

闭包函数:满足两点的函数都是闭包函数

1.定义在函数内部的函数

2.函数内部引用了外部函数作用域的名字

# 用闭包的方式给函数体传参:
def outter(x,y):  # 第三步,用另外一个函数将内层封装起来
    # x = 1  # 第二步,在函数my_max外部引用外部函数作用域名
    # y = 2
    def my_max():  #第一步,给函数传参
        if x > y :
            return x
        return y
    return my_max
res = outter(1,2)  # 返回的是x = 1, y = 2 时函数my_max()的函数名指向的函数体地址
print(res())  # 2  间接调用函数my_max(),并将结果返回值打印出来

 装饰器:

原则:开放封闭,对扩展开放,对修改封闭

此外,装饰器不能改变被装饰对象源代码,不能改变被装饰对象调用方式

# 补充知识点
import time  # 导入时间模块
print(time.time())  # 时间戳,表示当前时间距离1970-1-1  00:00:00相差的秒数
# 1970-1-1  00:00:00是Unix诞生的元年

time.sleep(3)  # 表示让cpu睡眠三秒,程序暂停三秒
#例子:统计index函数执行的时间
import time
def index():
    time.sleep(2)
    print('cvnifdhivusn')
start = time.time()
index()
end = time.time()
print('index run time:%s'%(end-start))

# 结果cvnifdhivusn
# index run time:2.000300168991089 休息了2秒,执行速度很快
# 装饰器简单版本
import time
def index():
    time.sleep(3)
    print('hiuehfjarh')

def outter(func):  # func = 最原始的index函数的内存地址
    def get_time():
        start = time.time()
        func()
        end = time.time()
        print('index run time:%s'%(end-start))
    return get_time
res = outter(index)  # outter(index) = get_time  返回的是get_time函数的内存地址
index = res  # 再将返回的内存地址赋值给变量index,做到以假乱真,调用方式不变的要求
index()
# 结果:hiuehfjarh
index run time:3.0003960132598877

 

 

 装饰器语法糖:会将紧挨着它的可调用对象的名字当作参数自动传入调用outter

@outter  # outter(index)
def index():
    pass

装饰器模板:

def outter(func):
    def inner(*args,**kwargs):
        print('     ')  # 执行被装饰函数之前,可以做的操作
        res = func(*args,**kwargs)
        print('   ')  # 执行被装饰函数之后,可以做的操作
        return = res
    return = inner
# 例子:认证装饰器
# 执行函数index之前必须先输入用户名和密码,正确之后才可以执行操作
# 否则提示用户输入错误,结束程序
user_dic = {'is_login':None}

def login_auth(func):
    def inner(*args,**kwargs):
        if user_dic['is_login']:  # 布尔值为False
            res = func(*args,**kwargs)
            return res
        else:
            username = input(':').strip()
            password = input(':').strip()
            if username == 'zhao' and password == '123':
                user_dic['is_login'] = True  # 账号及密码都正确则布尔值变为True
                res = func(*args,**kwargs)  # 执行函数func()并将结果用res接收
            else:
                print('username or password error')
    return inner

 

 多层装饰器:

装饰器在装饰的时候,顺序从下往上

装饰器在执行的时候,顺序从上往下

 

转载于:https://www.cnblogs.com/pupy/p/11176723.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值