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


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

  • 相关阅读:
    开淘店记录
    广告轮播效果
    loading事件加载效果
    正则表达式摘要
    cookie存取数据分析
    js 空格与回车处理
    数据对象型转换为数组型
    变换闪烁效果
    eclipse配置新环境
    五小时轻松入门Python
  • 原文地址:https://www.cnblogs.com/louzhiyuan/p/10420699.html
Copyright © 2011-2022 走看看