多层语法糖、有参装饰器、及递归函数

1|0多层语法糖、有参装饰器、及递归函数

1|1一、多层语法糖

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')
图片名称

1|2二、有参装饰器

# 当装饰器需要额外的参数时,我们可以用有参装饰器 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|3三、装饰器模板

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()

1|4四、装饰器修复技术

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|5五、递归函数

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.每次调用都比上次简单 递推:一层层往下 回溯:基于明确结果一层层往上

1|6六、昨日作业详解

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|7七、今日作业

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()
图片名称 图片名称 图片名称

__EOF__

本文作者泡芙有点甜
本文链接https://www.cnblogs.com/zx0524/p/16786047.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   小王应该在学习!  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示