Python学习路程——Day12
多层语法糖
'''
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形 index = outter1(wrapper2)
'''
def outter1(func1):
print('我是第3个输出的!')
def inner1(*args, **kwargs):
print('我是第4个输出的')
res1 = func1(*args, **kwargs) # func1 = inner2 res1 接收的返回值是 res2 也是index的 也是None
print('我是10第个输出的')
print(res1, '3')
return res1
return inner1
def outter2(func2):
print('我是第2个输出的!')
def inner2(*args, **kwargs):
print('我是第5个输出的')
res2 = func2(*args, **kwargs) # func2 = inner3 res2 的接收返回值 res3 也是index的 也是None
print('我是第9个输出的')
print(res2, '2')
return res2
return inner2
def outter3(func3): # outter3(index)
print('我是第1个输出的!') # 1
def inner3(*args, **kwargs):
print('我是第6个输出的')
res3 = func3(*args, **kwargs) # func3 =index res3 的返回值是index 为None
print('我是第8个输出的')
print(res3, '1')
return res3
return inner3
@outter1 # index = outter1(inner2) index = outter1(inner2) index = inner1
@outter2 # index = outter2(inner3)
@outter3 # index = outter3(index)
def index():
print('我是第7个输出的')
return 1
res = index()
print(res, '4')
输出结果
我是第1个输出的!
我是第2个输出的!
我是第3个输出的!
我是第4个输出的
我是第5个输出的
我是第6个输出的
我是第7个输出的
我是第8个输出的
1 1
我是第9个输出的
1 2
我是10第个输出的
1 3
1 4
有参装饰器
def outter(mode):
def longin_auth(func_name):
def inner(*args, **kwargs):
user_name = input('user_name>>>:').strip()
pass_word = input('pass_word>>>:').strip()
if mode == '1':
print('1')
res = func_name(*args, *kwargs)
return res
elif mode == '2':
print('2')
res = func_name(*args, *kwargs)
return res
elif mode == '3':
print('3')
res = func_name(*args, *kwargs)
return res
res = func_name(*args, *kwargs)
return res
return inner
return longin_auth
@outter('1')
def index():
print('1')
index()
@outter('2')
def func():
print('2')
func()
@outter('3')
def base():
print('3')
base()
输出结果
user_name>>>:aaa
pass_word>>>:111
1
1
user_name>>>:333
pass_word>>>:444
2
2
user_name>>>:555
pass_word>>>:666
3
3
有参装饰器模板
# def index():
# """index函数 非常的牛"""
# pass
# help(index)
# help(len)
from functools import wraps
def outer(func_name):
@wraps(func_name) # 仅仅是为了让装饰器的效果更加逼真 平时可以不写
def inner(*args, **kwargs):
"""我是inner 我擅长让人蒙蔽"""
res = func_name(*args, **kwargs)
return res
return inner
@outer
def func():
"""我是真正的func 我很强大 我很牛 我很聪明"""
pass
# help(func)
# print(func)
func()
装饰器修复技术
# def index():
# """index函数 非常的牛"""
# pass
# help(index)
# help(len)
from functools import wraps
def outer(func_name):
@wraps(func_name) # 仅仅是为了让装饰器的效果更加逼真 平时可以不写
def inner(*args, **kwargs):
"""我是inner 我擅长让人蒙蔽"""
res = func_name(*args, **kwargs)
return res
return inner
@outer
def func():
"""我是真正的func 我很强大 我很牛 我很聪明"""
pass
# help(func)
# print(func)
func()
递归函数
1
.函数的递归调用
函数直接或者间接的调用了函数自身
# 直接调用
# def index():
# print('from index')
# index()
# index()
# 间接
# def index():
# print('from index')
# func()
#
# def func():
# print('from func')
# index()
#
# func()
'''最大递归深度:python解释器添加的安全措施'''
# count = 0
# def index():
# global count
# count += 1
# print(count)
# index()
# index()
'''官网提供的最大递归深度为1000 我们在测试的时候可能会出现996 997 998'''
2.递归函数
1.直接或者间接调用自己
2.每次调用都必须比上一次简单 并且需要有一个明确的结束条件
递推:一层层往下
回溯:基于明确的结果一层层往上
"""
get_age(5) = get_age(4) + 2
get_age(4) = get_age(3) + 2
get_age(3) = get_age(2) + 2
get_age(2) = get_age(1) + 2
get_age(1) = 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,]]]]]]]]
2.利用有参装饰器编写多种用户登录校验策略
'''
l1 = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]
def outter(l1):
for i in l1:
if type(i) == list:
outter(i)
else:
print(i)
outter(l1)
l2 = [['Maria', '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):
global l2, d1
username = input('请输入用户名:').strip()
# if username in l2:
# password = input('请输入密码:').strip()
# if a == '1':
# if username == 'Tank' and password == '123':
# print('登陆成功')
# res = func(*args, **kwargs)
# return res
# print('用户名或密码错误')
# l2 = set(l2)
if username in l2[0][0] or username in l2[1][0]:
password = input('请输入密码:').strip()
if a == '2': # 列表
for i in l2:
if username == i[0] and password == i[1]:
print('登陆成功')
res = func(*args, **kwargs)
return res
print('用户名或密码错误')
elif username in d1:
password = input('请输入密码:').strip()
if 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()
@outer('2')
def login1():
print('from 列表')
login1()
@outer('1')
def login2():
print('from 默认')
login2()
标签:index,路程,func,Python,res,Day12,print,return,def
From: https://www.cnblogs.com/HaiMan/p/16786492.html