###装饰器
本质就是函数,为其他函数添加附加功能
原则:
1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
装饰器=高阶函数+函数嵌套+闭包
高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数
装饰器的架子:
def timmer(func):
def wrapper():
func()
return wrapper
@timmer 就相当于 test=timmer(test)#放在要修饰的函数前
timmer为已知装饰器
执行test()即执行wrapper()和func()
装饰器加返回值:
def timmer(func):
def wrapper():
res=func()
return res #此处返回被装饰函数的返回值
return wrapper
加参数
def timmer(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
*args 用来将参数打包成tuple给函数体调用
**kwargs 打包关键字参数成dict给函数体调用
注意:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。
test1(1,2,3,4,name=3)等同于test1(*(1,2,3,4),**{‘name’:’alex’}
装饰器流程
def timmer(func):
def wrapper(*args,**kwargs):
pass ‘’’加装饰器的功能’’’
res=func(*args,**kwargs)
return res
return wrapper
@timmer
def test():
pass
test() #此处为return返回wrapper,test()相当于wrapper所以流程调用wrapper()函数
###查看装饰器流程
debug
###示例添加认证功能
def auth_func(func):
def wrapper(*args,**kwargs):
username = input("username").strip()
passwd = input("passwd").strip()
if username == "xyy" and passwd == '123':
res = func(*args,**kwargs)
return res # 此处返回被装饰函数的返回值
else:
print("用户名或密码错误")
return wrapper
@auth_func
def index():
print("welcome to pk")
return 345
index()
###装饰器带参数
###解压序列
a,b.c = (1,2,3)
a,b,c = ‘hel’
li = [1,4,6,8,4,8,3,9,4,89,453,7,83,4]
a,*_,c = li #取li中第一个和最后一个值
或
a,*d, c = li #则d为[4,6,8,4,8,3,9,4,89,453,7,83]
a, c =(1,4)
a, b = b, a #交换a, b的值
strip() 用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
匿名函数执行完一次就不会在内存中出现
交 &
并 |
差 -
异或 ^
在列表中插入元素, list.insert(位置,元素)或list[位置:位置]=[元素,元素……]
list[0:0]=[‘xyy’]在0位置插入,冒号前后位置相同时,在原列表指定位置前插入指定元素