多层语法糖、有参装饰器、及递归函数
目录一、多层语法糖
1.语法糖会将下面紧挨着的名字传给@后面得函数并调用
2.从下到上加载,从上到下执行
3.最上层的语法糖做重命名操作
def outter1(func1):
print('加载了outter1')
def wrapper1(*args, **kwargs):
print('执行了wrapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2):
print('加载了outter2')
def wrapper2(*args, **kwargs):
print('执行了wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3):
print('加载了outter3')
def wrapper3(*args, **kwargs):
print('执行了wrapper3')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
@outter1
@outter2
@outter3
def index():
print('from index')
二、有参装饰器
# 当装饰器需要额外的参数时,我们可以用有参装饰器
def outter(mode): # '1'会被形参mode接收
def login_auth(func_name):
def inner(*args,**kwargs):
username = input('请输入您的用户名').strip()
password = input('请输入您的密码').strip()
if mode == '1':
print('用户名和密码是写死的')
elif mode == '2':
print('数据来源于文本文件')
elif mode == '3':
print('数据来源于字典')
elif mode == '4':
print('数据来源于数据库mysql')
return inner()
return login_auth()
@outter('1') # 函数名加括号执行的优先级最高
def index():
print('from index')
index()
# 函数名加括号执行优先级最高,先执行函数名加括号的操作,再是语法糖
@outter('2')
def func():
print('from func')
func()
# 为装饰器里面传递更多的参数
三、装饰器模板
1.最常用的装饰器模板
def outter(func_name):
def inner(*args,**kwargs):
res = func_name(*args,**kwargs)
return res
return inner
@outter
def index():
print('index')
index()
2.不常用的装饰器模板
def outter1(mode)
def outter(func_name):
def inner(*args,**kwargs):
res = func_name(*args,**kwargs)
return res
return inner
return outter
@outter1('1')
def index():
print('index')
index()
四、装饰器修复技术
def index():
pass
help(index) # index() Help on built-in function len in module builtins:
help(len) # len(obj, /) Return the number of items in a container.
# 为了让装饰器的效果更逼真,用下面的方法
from functools import wraps
def outter(func_name):
@wraps(func_name)
def inner(*args,**kwargs):
'''我是谁'''
res = func_name(*args,**kwargs)
return res
return inner
@outter
def index():
'''不知道吧'''
#print('index')
index()
五、递归函数
1.函数的递归调用
函数直接或者间接的调用了函数自身
# 直接调用
def index():
print('from index') # 重复执行,直到查询到死循环报错
index()
index()
# 间接调用
def index(): # 第一步
print('from index') # 六 十....
func() # 七 十一.....
def func(): # 第二步
print('from func') # 四 八......
index() # 五 九.......
func() # 第三步
# python 中允许的最大递归调用的次数
# 官网提供的最大递归深度为1000 我们在测试的时候可能会出现996 997 998
count = 0
def index():
global count
count += 1
print(count)
index()
index()
2.递归函数
1.直接或者间接调用自己
2.每次调用都比上次简单
递推:一层层往下
回溯:基于明确结果一层层往上
六、昨日作业详解
is_login = False
def login_auth(func_name):
def inner(*args,**kwargs):
global is_login
# 先判断全局名称空间中的变量名is_login绑定的值是否为True
if is_login:
res = func_name(*args, **kwargs)
return res
username = input('请输入您的用户名').strip()
pwd = input('请输入您的密码').strip()
if username == 'jason' and pwd == '123':
# 将全局名称空间中记录用户登录状态数据值为True
is_login = True
res = func_name(*args, **kwargs)
return res
else:
print('用户名或者密码有误')
return inner
@login_auth
def register():
print('注册')
@login_auth
def login():
print('登录')
@login_auth
def shopping():
print('购物')
register()
login()
shopping()
七、今日作业
1.利用递归函数依次打印列表中每一个数据值
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
def data_list(datas):
for i in datas:
if isinstance(i, list): # 判断当前数据是不是列表
data_list(i) # 是的话,进行递归调用
print(i,type(i))
data_list(l1)
# isinstance在Python中的意思是‘判断类型’,用于判断一个对象是不是一个一直的类型,类似于type()
# isinstance(object, classinfo) object是实例对象,classinfo可以是他们的类名
2.利用有参装饰器编写多种用户登录校验策略
print('''
1.用户名和密码是写死的
2.数据来源于文本文件
3.数据来源于字典
''')
choice = input('请输入您要操作的编号').strip()
def login_auth(mode):
def outter(func_name):
def inner(*args, **kwargs):
username = input('请输入您的用户名').strip()
password = input('请输入您的密码').strip()
if mode == '1':
# print('用户名和密码是写死的')
if username == 'jason' and password == '123':
res = func_name(*args, **kwargs)
return res
print('用户名或者密码有误')
elif mode == '2':
# print('数据来源于文本文件')
with open(r'a.txt', 'r',encoding='utf8') as f:
data = f.read()
name, pwd = data.split('|')
if name == username and pwd == password:
res2 = func_name(*args, **kwargs)
return res2
# print('操作失败')
elif mode == '3':
# print('数据来源于字典')
data = {'name':'jason','pwd':'111'}
name =data['name'] # 注意两个的位置排布
pwd = data['pwd']
if username == name and password == pwd:
res1 = func_name(*args, **kwargs)
return res1
print('操作失败')
return inner
return outter
@login_auth(choice)
def index():
print('操作成功')
index()
标签:index,return,name,递归函数,多层,语法,func,print,def
From: https://www.cnblogs.com/zx0524/p/16786047.html