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


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

猜你喜欢

转载自www.cnblogs.com/louzhiyuan/p/10420699.html