一、有参装饰器:给装饰器添加一个参数、来控制装饰器的行为。flask
@auth(参数)微信
auth里层的函数名 = auth(参数)数据结构
被装饰的函数名 = auth里层的函数名(被装饰的函数名)app
被装饰的函数名()框架
应用场景:flask框架的路由就是有参装饰器函数
def arg(argv):
def wrapper(func):
def inner(*args,**kwargs):
if argv:
print("开始装饰")
ret = func(*args,**kwargs)
if argv:
print("装饰结束")
return ret
return inner
return wrapper
def index():
print("is index")
wrapper = arg(True)
index = wrapper(index)
index()
# 结果:开始装饰
# is index
# 装饰结束
二、三层有参装饰器:
msg = """
1.微信
2.抖音
3.邮箱
请选择您要登录的软件:
"""
choose = input(msg)
def auth(arg):
def wrapper(func):
def inner(*args,**kwargs):
user = input("username:")
pwd = input("password:")
if arg == "1":
if user == "alex" and pwd == "alex1234":
func(*args,**kwargs)
elif arg == "2":
if user == "wusir" and pwd == "1234":
func(*args,**kwargs)
elif arg == "3":
if user == "meet" and pwd == "1234":
func(*args,**kwargs)
return inner
return wrapper
@auth(choose) #wechat = wrapper(wechat) = auth(choose)
def wechat():
print("微信")
a = auth(choose)
wechat = a(wechat)
wechat()
@auth(choose)
def dy():
print("抖音")
@auth(choose)
def email():
print("邮箱")
if choose == "1":
wechat()
elif choose == "2":
dy()
elif choose == "3":
email()
结果:微信
三、有参装饰器微信、抖音、邮箱:
msg = """
微信
抖音
邮箱
请选择您要登录的软件:
"""
choose = input(msg)
def auth(arg):
def wrapper(func):
def inner(*args,**kwargs):
user = input("username:")
pwd = input("password:")
if arg == "微信":
if user == "alex" and pwd == "alex1234":
func(*args,**kwargs)
else:
print("帐号或密码错误!")
elif arg == "抖音":
if user == "wusir" and pwd == "1234":
func(*args,**kwargs)
else:
print("帐号或密码错误!")
elif arg == "邮箱":
if user == "meet" and pwd == "1234":
func(*args,**kwargs)
else:
print("帐号或密码错误!")
return inner
return wrapper
@auth(choose) #wechat = wrapper(wechat) = auth(choose)
def wechat():
print("微信")
@auth(choose)
def dy():
print("抖音")
@auth(choose)
def email():
print("邮箱")
func_dic = {
"微信":wechat,
"抖音":dy,
"邮箱":email
}
if choose in func_dic:
func_dic[choose]()
else:
print("输入有误请从新输入!")
四、多个装饰器装饰一个函数时先执行离被装饰的函数最近的装饰器:
def f1(func): #func == index
def f2(*args,**kwargs):
print("这是f1的装饰开始")
func(*args,**kwargs)
print("这是f1的装饰结束")
return f2
def foo1(func): #func == f2
def foo2(*args,**kwargs):
print("这是foo1的装饰开始")
func(*args,**kwargs)
print("这是foo1的装饰结束")
return foo2
@foo1 #index = foo1(index) #index = foo1(f2)
@f1 #index = f1(index) #如今的index其实就是返回的f2
def index():
print("is index")
index() #foo2()
结果: 这是foo1的装饰开始
这是f1的装饰开始
is index
这是f1的装饰结束
这是foo1的装饰结束测试
看到的真不为真spa
看到的真不为真3d
看到的真不为真对象
五、递归的精华:一递一归。
六、递归的定义:不断调用本身自己(死递归)
有明确的结束条件
七、死递归以下:
def func():
print(1)
func()
func()
结果:RecursionError: maximum recursion depth exceeded while calling a Python object--递归错误:调用Python对象时,最大递归深度超过了
最大深度/层次、官方:1000、实际测试:998/997
八、修改递归最大深度:
import sys
sys.setrecursionlimit(1000)
九、递归举例:
def age(n):
if n == 3:
return 18
def age1(n):
if n == 3:
return 18
return age(n + 1) - 2
def age2(n):
if n == 3:
return 18
return age1(n + 1) - 2
print(age2(1))
# 结果:14
十、阶乘5层 1,2,3,4,5
结果:120
十一、斐波那契数列:1,1,2,3,5,8,13,21,34,55
十二、递归效率低:每次进入更深一层递归时,问题规模相比上次递归都应有所减小,递归效率不高,递归层次过多会致使栈溢出(在计算机中,函数调用就是经过栈(stack)这种数据结构实现的,每当进入一个函数调用时,栈就会增长一层栈,每当函数返回时,栈就会减小一层,因为栈的大小不是无限的,因此,递归调用的次数过多,会致使栈溢出。
做业题: