多层语法糖
def func1(a1): # 1 定义了函数func1 # 14 func1(foo2)
print('加载了func1') # 15 加载了func1
def foo1(*args, **kwargs):
print('执行了foo1') # 17 执行了 foo1
res1 = a1(*args, **kwargs) # 18 此时a1 = foo2 调用foo2
return res1
return fool # 16 返回值 fool 上层已经没了,直接调用
def func2(a2): # 2 定义了函数func2 # 10 此时func2(foo3函数体代码)
print('加载了func2') # 11 加载了func2
def foo2(*args, **kwargs):
print('执行了foo2') # 19 执行了foo2
res2 = a2(*args, **kwargs) # 20 此时a2 = foo3 调用foo3
return res2
return foo2 # 12 foo2返回给func1
def fun3(a3): # 3 定义了函数func3 # 6 此时func(index函数体代码)
print('加载了func3') # 7 加载了func3
def foo3(*args, **kwargs):
print('执行了foo3') # 21 执行了foo3
res3 = a3(*args, **kwargs) # 22此时 a3 = index 调用index
return res3
return foo3 # 8 返回foo3 值给func2
@func1 # 13 返回值给func1(foo2) 调用func1
@func2 # 9 此时func2(foo3) 调用func2
@func3 # 5 调用func3 func3(index函数体代码)
def index(): # 4 定义了函数f语法糖将函数名index当做参数传输过去
print('我在这') # 23 打印了我在这
index()
"""打印顺序"""
加载了func3
加载了func2
加载了func1
执行了foo1
执行了foo2
执行了foo3
我在这
有参装饰器
在我们使用校验用户是否登录装饰器时,如果我们使用了多种用户来源校正,那么就需要传一个参数给装饰器。 但是装饰器原本的形参又不能改变,那么当装饰器中需要额外的参数时我们就可以使用有参装饰器。在装饰器外层在包一层函数。
def outer(a):
def login_auth(func):
def inner(*args, **kwargs):
username = input('请输入用户名').strip()
passwold = input('请输入密码').strip()
if a == '1':
print('固定用户名jason 密码 123 ')
elif a == '2':
print('在文本里校验用户')
elif a == '3':
print('在字典里校验用户')
return inner
return login_auth
@outer('2') """请注意,只要函数名带括号那么无论右边是变量名还是@ 都优先执行函数"""
def func():
print('在文本里校验正确啊')
@outer('3')
def func():
print('在字典里校验成功啊')
有参装饰器模板
def a1(a):
def a2(func):
def a3(*args, **kwargs):
print('执行被装饰对象前添加的功能')
res = func(*args, **kwargs)
print('执行被装饰对象后添加的功能')
return res
return a3
return a2
@a1(传个参数)
def foo():
pass
装饰器修复技术
from functools import wraps
def outer(func):
@wraps(func)
def inner(*args, **kwargs):
print('啥米是装饰器')
res = func(*args, **kwargs)
return res
return inner
@outer
def foo():
print('我才是真正的foo')
foo()
装饰器修复技术其实没啥大用,在我们不使用@wraps时,函数foo已经被传参到 func了
"""func = foo()真正执行的函数其实是func)"""
修复技术只是用来忽悠你把函数foo改回成真的foo"""不是真的改,其实戴了个面具""" 啥都没变。
递归函数
递归的概念
在函数里直接或者间接调用自己>>>>>递归函数
递归函数里如果我们不给返回值那么他会一直循环递归,最大递归深度是1000.
递归应当必须要有结束条件且下一次要比上一次更简单。(距离结束条件更近)
直接调用自己
def foo():
print('直接调用了自己')
foo()
foo()
'''RecursionError: maximum recursion depth exceeded while calling a Python object'''python解释器中限制了没有条件的递归函数最大递归深度只有1000,当超过1000次就会报错
间接调用自己
def foo():
print('间接调用自己')
func()
def func():
print('哈哈')
foo()
func()
# 结果报错 同上
递归函数用法
计算1- 100之和
def func1(n):
if n < 1:
return 1
else:
return func1(n-1) + n
res = func1(100)
print(res)
作业
b = False
user_name_dict = {'1': {'name': 'jack', 'passwold': '123'},
'2': {'name': 'tank', 'passwold': '123'}}
def outer(a):
def outer1(func):
def inner(*args, **kwargs):
username = input('请输入用户名').strip()
passwold = input('请输入密码').strip()
if a == '1':
if username == 'tank' and passwold == '123':
print('验证成功')
res = func(*args, **kwargs)
return res
else:
print('验证失败')
elif a == '2':
for i in user_name_dict:
user_dict = user_name_dict.get(i)
temp_list = user_dict.values()
if username in temp_list and passwold in temp_list:
print('验证成功')
res = func(*args, **kwargs)
return res
else:
print('验证失败')
elif a == '3':
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for i in f:
real_name, real_pwd = i.split('|')
if real_name == username and real_pwd.strip('\n') == passwold:
print('验证成功')
res = func(*args, **kwargs)
return res
else:
print('验证失败')
return inner
return outer1
@outer('1')
def foo1():
print('写好的用户名和密码')
@outer('2')
def foo2():
print('字典校验')
@outer('3')
def txt():
print('文件验证')
data_dict = {
'1': foo1,
'2': foo2,
'3': txt
}
while True:
print("""
1.固定登录
2.字典校验
3.文件校验
""")
choice = input('请输入你想要执行的功能').strip()
if choice in data_dict:
num = data_dict.get(choice)()
标签:return,递归函数,args,多层,语法,func,kwargs,print,def
From: https://www.cnblogs.com/LiaJi/p/16785963.html