zoukankan      html  css  js  c++  java
  • 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


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

  • 相关阅读:
    〖教程〗Ladon提权MS16-135参数版(WIN7-2016)
    〖教程〗RDP会话劫持 Ladon无密码登陆管理员桌面会话
    Ladon for PowerShell远程加载教程
    〖教程〗NbtScan 139端口弱口令/Netbios密码爆破
    给你一个免费加入"小密圈"的机会
    活动目录(Active Directory,AD)的主要功能
    如何通过审计安全事件日志检测密码喷洒(Password Spraying)攻击
    mouseenter 和mouseover的区别
    如何获取可视区域宽高,获取元素到在文档中的位置
    闭包
  • 原文地址:https://www.cnblogs.com/louzhiyuan/p/10420699.html
Copyright © 2011-2022 走看看