python学习 new_day15
同时叠加多个装饰器
第一个装饰器:
def deco1(func1): # func1 = wrapper2
def wrapper1(*args, **kwargs):
print('=======>wrapper1')
res1 = func1(*args, **kwargs) #wrapper2==》未完
return res1
return wrapper1
第二个装饰器:
def deco2(func2): # func2 = wrapper3
def wrapper2(*args, **kwargs):
print('=======>wrapper2')
res2 = func2(*args, **kwargs) # wrapper3==》未完
return res2
return wrapper2
第三个装饰器:
def deco3(func3): # func3 = index
def wrapper3(*args, **kwargs):
print('=======>wrapper3')
res3 = func3(*args, **kwargs) # index==》未完
return res3
return wrapper3
被叠加装饰的函数对象:
@deco1 # deco1(wrapper2)=>wrapper1
@deco2 # deco2(wrapper3)=>wrapper2
@deco3 # deco3(index)=>wrapper3
def index():
print("from index")
return 123
res=index() # res=wrapper1()
结论:
1、装饰器的加载顺序是自下而上的
2、装饰器的执行顺序是自上而下的
案例:给函数添加登陆与计时
import time
def timmer(func):
def wrapper1(*args, **kwargs):
print('===>wrapper1')
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper1
def auth(func):
def wrapper2(*args, **kwargs):
print('===>wrapper2')
name = input("请输入您的账号:").strip()
pwd = input("请输入您的账号:").strip()
if name == "egon" and pwd == "123":
print('登录成功')
res = func(*args, **kwargs)
return res
else:
print("账号密码错误")
return wrapper2
@auth
@timmer
def index():
time.sleep(1)
print("from index")
return 123
# wrapper2=>wrapper1=>index
index() # wrapper1()
函数的递归
函数的递归调用:指的是在调用一个函数的过程中又直接或者间接地调用了自己
函数的递归调用就是一个循环的过程
递归调用应该遵循的一个大前提是:必须在满足某种条件下结束递归调用,然后向上一层一层返回
- 递归调用经历两个阶段
1、回溯:向下一层一层地调用
2、递推:在某一层终止调用,开始向上一层一层返回
def salary(n): # n = 1
if n == 1: # 当n等于1时结束回溯
return 5000
return salary(n - 1) + 1000
res = salary(4)
print(res)
总结:
递归调用就是一个循环的过程,循环的次数取决何时结束调用自身
应用1:将列表中的所有数字打印出来
list1 = [1, [2, [3, [4, [5, [6, [7, [9, ]]]]]]]]
def func(nums_l):
for x in nums_l:
if type(x) is list:
func(x)
else:
print(x)
func(list1)
应用2:二分法
在一个有序排列的数字列表中,判断某一数是否存在其中
如:nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45]
常规写法:效率低
find_num = 45
for num in nums:
if find_num == num:
print('找到啦')
break
else:
print("不存在")
方案二:二分法
nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45]
find_num = 47
def search(find_num,nums):
print(nums)
# 输入进来的列表若为空,则判断不存在该数
if len(nums) == 0:
print('不存在')
return
# 取得该列表的中间数
mid_index = len(nums) // 2
# 当要查找的数大于中间数时
if find_num > nums[mid_index]:
# 将中间数以右提取出来
new_nums = nums[mid_index + 1:]
# 将要查找数与右半部分输入给参数执行
search(find_num,new_nums)
# 当要查找数小于中间数时,查找中间数以左
elif find_num < nums[mid_index]:
# 将中间数以左提取出来
new_nums = nums[:mid_index]
# 将要查找数与左半部分输入给参数执行
search(find_num,new_nums)
# 当查找数等于中间数时,显示找到
else:
print("找到啦")
# 给函数输入要查找数与列表,并执行
search(find_num,nums)