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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值