今日内容概要
- 多层语法糖
- 有参装饰器
- 装饰器修复技术
- 递归函数
今日内容详细
多层语法糖
'''
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形index = outer1(inner2)
'''
def outer1(func1):
print('执行了outer1')
def inner1(*args, **kwargs):
print('执行了inner1')
res1 = func1(*args, **kwargs)
return res1
return inner1
def outer2(func2):
print('执行了outer2')
def inner2(*args, **kwargs):
print('执行了inner2')
res2 = func2(*args, **kwargs)
return res2
return inner2
def outer3(func3):
print('执行了outer3')
def inner3(*args, **kwargs):
print('执行了inner3')
res3 = func3(*args, **kwargs)
return res3
return inner3
@outer1
@outer2
@outer3
def index():
print('from index')
index()
有参装饰器
'''当装饰器中需要额外的参数时 得使用有参装饰器'''
# 在外层再套用一个函数 用于接收额外的参数
'''示例'''
def outer(a):
def login_auth(func):
def inner(*args, **kwargs):
if a = '1':
print("条件成立执行的代码")
res = func(*args, **kwargs)
return res
elif a = '2':
print("条件成立执行的代码")
res = func(*args, **kwargs)
return res
elif a = '3':
print("条件成立执行的代码")
res = func(*args, **kwargs)
return res
return inner
return login_auth
'''
函数名加括号先执行 优先级最高 有参装饰器的情况
先看函数名加括号的执行
然后再是语法糖的操作
'''
@outer('1') # 在这给有参装饰器传参
def index():
print('from index')
index()
装饰器模板
'''最常用的无参装饰器模板'''
def outer(func_name):
def inner(*args, **kwargs):
res = func_name(*args, **kwargs)
return res
return inner
@outer
def index():
pass
'''不常用的有参装饰器模板'''
def outer_plus(a):
def outer(func_name):
def inner(*args, **kwargs):
res = func_name(*args, **kwargs)
return res
return inner
return outer
@outer_plus('a')
def func():
pass
装饰器修复技术
'''
当其他人不会用被装饰的函数时可能会用help查看,这时就会暴露 会显示出其实是执行了其他函数实现的 这时候就可以通过导入模块functools下的wraps实现 让其他人即使使用了help也不会暴露出真正执行的函数,而是显示被查看的函数
'''
# 使用模板
from functools import wraps
def outer(func_name):
@wraps(func_name) # 仅仅是为了让装饰器的效果更加逼真 平时可以不写
def inner(*args, **kwargs):
res = func_name(*args, **kwargs)
return res
return inner
递归函数
1.函数的递归调用
函数直接或者间接的调用了函数自身
'''直接调用'''
def func():
print('from func')
func() # 自身调用自身 会一直执行直到达到最大递归深度
func()
'''间接调用'''
def func1():
print('from func1')
func2()
def func2():
print('from func2')
func1()
func1()
'''最大递归深度:python解释器添加的安全措施 官网提供的最大递归深度为10001 我们在测试的时候可能会出现996 997 998'''
2.递归函数
直接或者间接调用自己
每次调用都必须必上一次简单 并且需要有一个明确的结束条件
递归:一层层往下
回溯:基于明确的结果一层层往上
'''递归函数案例
求第一个人年龄 第二个人比第一个人小两岁 第三个人比第二个人小两岁 第四个人比第三个人小两岁 第五个人18岁比第四个人小两岁
'''
def get_age(n):
if n == 1:
return 18
return get_age(n-1) + 2
res = get_age(5)
print(res)
作业
'''1.利用递归函数依次打印列表中每一个数据值
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]'''
l1 = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]
def func(j):
for i in j:
if type(i) == list:
func(i)
else:
print(i)
func(l1)
'''2.利用有参装饰器编写多种用户登录校验策略'''
l2 = [['jason', '123'], ['jack', '234']]
d1 = {'jason': {'name': 'jason', 'pwd': '123'}, 'kevin': {'name': 'kevin', 'pwd': '234'}}
def outer(a):
def login_auth(func):
def inner(*args, **kwargs):
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
if a == '1':
if username == 'jason' and password == '123':
print('登陆成功')
res = func(*args, **kwargs)
return res
print('用户名或密码错误')
elif a == '2': # 列表
for i in l2:
if username == i[0] and password == i[1]:
print('登陆成功')
res = func(*args, **kwargs)
return res
print('用户名或密码错误')
elif a == '3': # 字典
if username in d1:
b = d1.get(username)
name, pwd = b.values()
if username == name and password == pwd:
print('登陆成功')
res = func(*args, **kwargs)
return res
print('用户名或密码错误')
elif a == '4': # 文件 需要提前创建
with open('text', 'r', encoding='utf8') as f:
for i in f:
name, pwd = i.strip().split('|')
if username == name and password == pwd:
print('登陆成功')
res = func(*args, **kwargs)
return res
print('用户名或密码错误')
else:
print('没有')
return inner
return login_auth
@outer('3')
def login():
print('from login')
login()
@outer('2')
def login1():
print('from login1')
login1()
@outer('1')
def login2():
print('from login2')
login2()
标签:13,return,Python,res,基础,func,kwargs,print,def
From: https://www.cnblogs.com/lzjjjj/p/16785766.html