多层装饰器
'''
语法糖会将紧挨着的被装饰对像的名字当作参数自动传入装饰器函数中
'''
def outter1(func1):
print('outter1')
def wrapper1(*args, **kwargs):
print('wrapper1')
res1 = func1(*args, **kwargs)
retern 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')
res2 = func3(*args, **kwargs)
return res3
return wrapper3
@outter3
@outter2
@outter1
def index():
print('index')
有参装饰器
def outter(data):
def login_auth(func_name):
def inner(*args, **kwargs):
username = input('username>>>').strip
owd = input('pwd>>>').strip
'''
校验用户数据 数据的来源可以有很多 比如全局字典 全局列表 文件等 数据的来源不同 处理方式就不同 对应的代码编写就不一样分支结构处理 根据不同的参数 匹配不同的流程
'''
if data == '1'
print('使用字典的方式处理数据')
if data == '2'
print('使用处理列表的方式处理数据')
else:
print('采用其他方式')
res = func_name(*args, **kwargs)
return res
return inner
return login_auth
'''
函数名加括号的执行优先级最高
@outer('2')
左侧是语法糖结构 右侧是函数调用,由于函数调用优先级最高,所以,现调用outer('2') 返回值login_auth
然后就变成了 @login_auth
与普通的装饰器一样
'''
递归函数
本质是,函数在运行过程中,直接或者间接的调用函数本身
def index():
print('index')
index()
index()
def func():
index()
def index():
finc()
index()
'''
当上面这种情况发生,也就是,函数一直递归调用,没有结束条件,函数的复杂的没有降低,也就是,无意义的递归,在函数递归调用1000次后,python解释器会强行停止递归,并报错提醒,超出最大递归深度
'''
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
'''
递归函数的使用应该满足两个条件:
1.每次递归复杂的应该降低
2.有明确的结束条件
'''
递归函数练习
'''
五排学生最后一排学生18,前面一排学生比后面的学生大2岁,求第一排学生的年龄
'''
def func(count):
if count == 1:
return 18
return func (count - 1) + 2
print(func(5))
'''
取出列表l = [1,[2,[3,[4,[5]]]]]中的每一个数字
'''
l = [1,[2,[3,[4,[5]]]]]
def func(list):
for i in list:
if isinstance(i,int):
print(i)
else:
return func(i)
func(l)
二分法
'''
二分法是一个基础的算法,是算法里面比价简单的一个, 算法就是解决问题的有效方法,方法不同,效率不同
'''
l1 =[13,21,35,46,52,67,76,87,99,123,213,321,432,564,612]
'''
二分法原理,获取数据集的中间元素,与所查元素比较大小
以升序为例
如果中间元素大于99,就保留数据集左边的元素,再次二分,循环往复,直到找到对应元素
如果中间元素小于99,则保留右边的元素
'''
def index(l, num):
if len(l) == 0:
print('没有这个数')
res = len(l)
middle = res // 2
if l[middle] == num:
print('找到了')
if l[middle] > num:
l_left = l[0:middle]
print(l)
index(l_left, num)
if l[middle] < num:
l_right = l[middle + 1:]
print(l)
index(l_right, num)
index(l1,99)
index(l1, 99)
'''
二分法的缺陷
1.如果要找的元素在开头,二分法会更复杂
2.数据集必须是有序的
'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人