1.装饰器
本质就是函数,功能是为其他函数添加附加功能
原则:
(1)不修改被修饰函数的源代码
(2)不修改被修饰函数的调用方式

import time
def cal(l):
    start_time=time.time()
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    stop_time=time.time()
    print("函数运行的时间是%s"%(stop_time-start_time))
    return res
print(cal(range(20)))

装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包

#添加装饰器
import time
def timer(func):
    def wapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print("函数运行的时间是%s"%(stop_time-start_time))
        return res
    return wapper
@timer#原先函数前添加@装饰器名称
def cal(l):
    res=0
    for i in l:
        time.sleep(0.1)
        res+=i
    return res
print(cal(range(20)))


2.高阶函数
定义:参数是函数或返回值是函数
3.闭包
import time
def timer(func):
    def wapper():
        print(func)
        func()
    return wapper

def test():
    time.sleep(3)
    print('test函数运行完毕')
test=timer(test)
test()
这样就实现了装饰器,但是需要写test=timer(test),再次修改
在需要装饰的函数之前加@装饰器代替test=timer(test)

import time
def timer(func):
    def wapper():
        print(func)
        func()
    return wapper
@timer
def test():
    time.sleep(3)
    print('test函数运行完毕')

test()
添加功能:
import time
def timer(func):
    def wapper():
        print(func)
        start_time=time.time()
        func()
        stop_time = time.time()
        print("函数运行时间%s"%(stop_time-start_time))
    return wapper
@timer
def test():
    time.sleep(3)
    print('test函数运行完毕')

test()
4.添加返回值
import time
def timer(func):
    def wapper():
        print(func)
        start_time=time.time()
        res=func()
        stop_time = time.time()
        print("函数运行时间%s"%(stop_time-start_time))
        return res
    return wapper
@timer
def test():
    time.sleep(1.6)
    print('test函数运行完毕')
    return "这是test的返回值"
print(test())
5.添加传入参数
import time
def timer(func):
    def wapper(name,age):
        print(func)
        start_time=time.time()
        res=func(name,age)
        stop_time = time.time()
        print("函数运行时间%s"%(stop_time-start_time))
        return res
    return wapper
@timer
def test(name,age):
    time.sleep(1.6)
    print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
    return "这是test的返回值"
print(test("liang",18))

@timer
def test1(name,age,gender):
    time.sleep(1.6)
    print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
    return "这是test的返回值"
print(test1("liang",18,'nan'))

同时装饰不同函数时出错,需要改为可变长参数
import time
def timer(func):
    def wapper(*args,**kwargs):
        print(func)
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time = time.time()
        print("函数运行时间%s"%(stop_time-start_time))
        return res
    return wapper
@timer
def test(name,age):
    time.sleep(1.6)
    print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
    return "这是test的返回值"
print(test("liang",18))

@timer
def test1(name,age,gender):
    time.sleep(1.6)
    print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
    return "这是test1的返回值"
print(test1("liang",18,'nan'))

6.通过解压序列获取列表的第一个和最后一个数据(不通过索引)
l=[10,34,1,45,456,6,7657,567,9]
a,*_,b=l
结果:a=10
b=9
中间不需要的数值放在变量_中

使用索引a,d=l[0],l[-1]
7.变量交换
f1,f2=f2,f1
8.点击所有功能,都添加登录验证,即在原函数上添加装饰器
user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'lhf','passwd':'123'},
    {'name':'wpq','passwd':'123'},
    {'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic['username'] and current_dic['login']:
            res=func(*args,**kwargs)
            return res
        username=input('用户名:').strip()
        passwd=input('密码:').strip()
        for usr_dic in user_list:
            if username==usr_dic['name'] and passwd==usr_dic['passwd']:
                current_dic['username'] = username
                current_dic['login'] = True
                res = func(*args, **kwargs)
                return res
        else:#整个遍历完都没找到
            print('用户名或密码错误,请重新登录')
    return wrapper

@auth_func
def home(name):
    print("欢迎回家%s"%name)
@auth_func
def shopping_car(name):
    print("%s的购物车里有[%s,%s,%s]"%(name,'奶茶','妹妹','ww'))
@auth_func
def index(name):
    print("欢迎来到京东%s"%name)

index('chap')
home('ads')
shopping_car('d')
9.装饰器带参数
def auth(auth_type='filedb')
	原先的函数
    return auth_func


user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'lhf','passwd':'123'},
    {'name':'wpq','passwd':'123'},
    {'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth(auth_type='filedb'):
    def auth_func(func):
        def wrapper(*args,**kwargs):
            if auth_type=='filedb':
                if current_dic['username'] and current_dic['login']:
                    res=func(*args,**kwargs)
                    return res
                username=input('用户名:').strip()
                passwd=input('密码:').strip()
                for usr_dic in user_list:
                    if username==usr_dic['name'] and passwd==usr_dic['passwd']:
                        current_dic['username'] = username
                        current_dic['login'] = True
                        res = func(*args, **kwargs)
                        return res
                else:#整个遍历完都没找到
                    print('用户名或密码错误,请重新登录')
            if auth_type == 'ldap':
                print('使用ldap短信登陆')
        return wrapper
    return auth_func
@auth(auth_type='ldap')
def home(name):
    print("欢迎回家%s"%name)

home('ads')

  

 

1.装饰器
本质就是函数,功能是为其他函数添加附加功能
原则:
(1)不修改被修饰函数的源代码
(2)不修改被修饰函数的调用方式

import time
def cal(l):
start_time=time.time()
res=0
for i in l:
time.sleep(0.1)
res+=i
stop_time=time.time()
print("函数运行的时间是%s"%(stop_time-start_time))
return res
print(cal(range(20)))

装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包

#添加装饰器
import time
def timer(func):
def wapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print("函数运行的时间是%s"%(stop_time-start_time))
return res
return wapper
@timer#原先函数前添加@装饰器名称
def cal(l):
res=0
for i in l:
time.sleep(0.1)
res+=i
return res
print(cal(range(20)))


2.高阶函数
定义:参数是函数或返回值是函数
3.闭包
import time
def timer(func):
def wapper():
print(func)
func()
return wapper

def test():
time.sleep(3)
print('test函数运行完毕')
test=timer(test)
test()
这样就实现了装饰器,但是需要写test=timer(test),再次修改
在需要装饰的函数之前加@装饰器代替test=timer(test)

import time
def timer(func):
def wapper():
print(func)
func()
return wapper
@timer
def test():
time.sleep(3)
print('test函数运行完毕')

test()
添加功能:
import time
def timer(func):
def wapper():
print(func)
start_time=time.time()
func()
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return wapper
@timer
def test():
time.sleep(3)
print('test函数运行完毕')

test()
4.添加返回值
import time
def timer(func):
def wapper():
print(func)
start_time=time.time()
res=func()
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test():
time.sleep(1.6)
print('test函数运行完毕')
return "这是test的返回值"
print(test())
5.添加传入参数
import time
def timer(func):
def wapper(name,age):
print(func)
start_time=time.time()
res=func(name,age)
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test(name,age):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
return "这是test的返回值"
print(test("liang",18))

@timer
def test1(name,age,gender):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
return "这是test的返回值"
print(test1("liang",18,'nan'))

同时装饰不同函数时出错,需要改为可变长参数
import time
def timer(func):
def wapper(*args,**kwargs):
print(func)
start_time=time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test(name,age):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
return "这是test的返回值"
print(test("liang",18))

@timer
def test1(name,age,gender):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
return "这是test1的返回值"
print(test1("liang",18,'nan'))

6.通过解压序列获取列表的第一个和最后一个数据(不通过索引)
l=[10,34,1,45,456,6,7657,567,9]
a,*_,b=l
结果:a=10
b=9
中间不需要的数值放在变量_中

使用索引a,d=l[0],l[-1]
7.变量交换
f1,f2=f2,f1
8.点击所有功能,都添加登录验证,即在原函数上添加装饰器
user_list=[
{'name':'alex','passwd':'123'},
{'name':'lhf','passwd':'123'},
{'name':'wpq','passwd':'123'},
{'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for usr_dic in user_list:
if username==usr_dic['name'] and passwd==usr_dic['passwd']:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:#整个遍历完都没找到
print('用户名或密码错误,请重新登录')
return wrapper

@auth_func
def home(name):
print("欢迎回家%s"%name)
@auth_func
def shopping_car(name):
print("%s的购物车里有[%s,%s,%s]"%(name,'奶茶','妹妹','ww'))
@auth_func
def index(name):
print("欢迎来到京东%s"%name)

index('chap')
home('ads')
shopping_car('d')
9.装饰器带参数
def auth(auth_type='filedb')
原先的函数
return auth_func


user_list=[
{'name':'alex','passwd':'123'},
{'name':'lhf','passwd':'123'},
{'name':'wpq','passwd':'123'},
{'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth(auth_type='filedb'):
def auth_func(func):
def wrapper(*args,**kwargs):
if auth_type=='filedb':
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for usr_dic in user_list:
if username==usr_dic['name'] and passwd==usr_dic['passwd']:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:#整个遍历完都没找到
print('用户名或密码错误,请重新登录')
if auth_type == 'ldap':
print('使用ldap短信登陆')
return wrapper
return auth_func
@auth(auth_type='ldap')
def home(name):
print("欢迎回家%s"%name)

home('ads')