• 11 函数闭包与装饰器


    装饰器:本质就是函数 功能是为其他函数添加辅助功能
    原则:不修改被修饰函数的源代码
    不修改被修饰函数的调用方式

    import time
    def cal (l):
        start_time=time.time() #+
        res=0
        for i in l:
            res+=i
        stop_time=time.time()
        print('函数运行时间是%s'%(stop_time-start_time))    #+
        return res

    装饰器=高阶函数+函数嵌套+闭包

    例子1:高阶函数

    import time
    def foo():
        time.sleep(3)
        print('hello Mr.lin')
    
    def timer(func):
        print(func)
        start_time=time.time()
        func()
        stop_time=time.time()
        print('函数运行的时间是%s'%(stop_time-start_time))
    ##timer(foo)    #改变了调用方式XXX
    
    foo=timer(foo)
    foo()    #未修改调用方式
    ###BUT 多执行了一次
        


    例子2:函数嵌套 闭包

    def father(name):
        print('from father%s'%name)
        def son():
            print('my father is %s'%name)
        son()
    father('ABC')



    例子3:
    装饰器框架

    @timmer
    def timer(func):
        def wrapper():
            start_time=time.time()
            func()
            stop_time=time.time()
            print('函数运行的时间是%s'%(stop_time-start_time))
        return wrapper
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    
    #test=timer(test)
    #test()
    
    @timmer相当于上述二行 语法行


    例子4:
    加上返回值

    def timer(func):
        def wrapper():
            start_time=time.time()
            res=func()    #取返回值
            stop_time=time.time()
            print('函数运行的时间是%s'%(stop_time-start_time))
            return res
        return wrapper
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    return (123) 


    例子5:
    加上参数

    def timer(func):
        def wrapper(*args,**kwargs):
          
        start_time=time.time()

        res=func(*args,**kwargs) #不固定个数参数
        stop_time=time.time() 

        print('函数运行的时间是%s'%(stop_time-start_time))

        return res
      
    return wrapper

    def test():
      time.sleep(
    3)

      print('test函数运行完毕,名字是%s,年龄是%s, 性别是%s'%(name,age,gender)) return (123)

    解压序列
    l=(1,2,3,4,5,7,6,8)
    a,_*,c=l
    a=1,c=8

    京东后端示例:

    def auth_func(func)
        def wrapper(*args,**kwargs):
            username=input('用户名').strip()
            passwd=input('用户名').strip()
            if username =='sb' and passwd == '123'
                res=func(*args,**kwargs)
                return res
            else:
            print('error')
        return wrapper
    
    @auth_func
    def index():
        print('welcome to jingdong')
    def home():
        print('welcome home')
    def shopping_car():
        print('there is [%s,%s,%s] in shopping_car'%('奶茶''可乐','牛奶'))
    def order():
        pass



    登录升级版

    def auth_func(func):
        def wrapper(*args,**kwargs):
            if user_dic['username'] and user_dic['login']
                res=func(*args,**kwargs)
                return res
            username=input('用户名').strip()
            passwd=input('用户名').strip()
            if username =='sb' and passwd == '123'
                user_dic['username']=username
                user_dic['login']=TRUE
                res=func(*args,**kwargs)
                return res
            else:
                print('error')
        return wrapper


    #不必刷新一下页面输入一次密码 改变了变量

  • 相关阅读:
    Linux系统目录结构介绍
    【Android开发学习笔记】【第二课】Activity学习
    【Android开发学习笔记】【第一课】初识New Project,工程文件介绍
    Android 环境快速搭建-详细步骤-win7-64bit
    【VC6】【集成工具】将输入信息集成到VC工具中
    Intellij IDEA快捷键
    C#+Winform开发窗体程序
    使用U盘重装系统
    C#进阶学习笔记
    C#基础学习笔记
  • 原文地址:https://www.cnblogs.com/louzhiyuan/p/10420699.html
Copyright © 2020-2023  润新知