python开发学习day15 (叠加装饰器;递归调用;匿名函数)

2020-06-19                         目录:

一、同时叠加多个装饰器

1.1  加载顺序

1.2  执行顺序

二、函数的递归调用

2.1  介绍

2.2  使用前提和运行过程

2.3  总结及应用

三、匿名函数

3.1  定义

3.2  用法

一、同时叠加多个装饰器

1.1  加载顺序

装饰器的加载顺序是自下而上的:

def deco1(func1):  # func1 = wrapper2
    def wrapper1(*args, **kwargs):
        print('=======>wrapper1')
        res1 = func1(*args, **kwargs)  #执行时先调用func1即wrapper2
        return res1
    return wrapper1  # 传函数名给被修饰过的的index

def deco2(func2):  # func2 = wrapper3
    def wrapper2(*args, **kwargs):
        print('=======>wrapper2')
        res2 = func2(*args, **kwargs)  # wrapper2执行时再调用func2即wrapper3
        return res2
    return wrapper2  # 传函数名给deco1()的参数func1

def deco3(func3):  # func3 = index
    def wrapper3(*args, **kwargs):
        print('=======>wrapper3')
        res3 = func3(*args, **kwargs)  # wrapper3执行时再调用func3即index
        return res3
    return wrapper3  # 传函数名给deco2()的参数func2

        # 最终index = wrapper1


@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  执行顺序

装饰器的执行顺序是自上而下的

二、函数的递归调用

2.1  介绍

函数的递归调用就是在调用一个函数的过程中又直接或者间接调用了自己
函数的递归调用本质上就是一个=循环的过程
如:
def f1():
print('111')
f1()

f1() # 调用函数f1实际上会变成一个死循环

2.2  使用前提和运行过程

递归调用应该遵循的一个大前提是:必须在满足某种条件下结束递归调用,然后向上一层一层返回
否则会一直不停调用自身创建局部名称空间,造成内存溢出
递归调用经历两个阶段:
1、回溯:向下一层一层地调用
2、递推:在某一层终止调用,开始向上一层一层返回

2.3  总结及应用

函数的递归调用就是一个循环的过程,循环的次数取决于何时结束调用自身

  应用一:

  将列表 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)

  应用二:查找一个数字是否存在于一个有序的列表中

nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45]


def search(list1, find_num):
    if len(list1) == 0:
        print("找不到")
        return

    mid_length = len(list1) // 2
    if find_num > list1[mid_length]:
        new_list = list1[mid_length + 1:]
        search(new_list, find_num)
    elif find_num < list1[mid_length]:
        new_list = list1[:mid_length]
        search(new_list, find_num)
    else:
        print('找到了')


search(nums, 1)

三、匿名函数

3.1  定义

匿名函数就是没有名字的函数
只用于临时只用一次的场景

3.2  用法

匿名函数通常用于与其他函数配合使用

  如:取字典中值最大的key,使用函数就如下:

nums = {"a": 10, "b": 12, "c": 11}


def func(k):
    return nums[k]

res = max(nums, key=func)
print(res)

  也可以使用匿名函数:

nums = {"a": 10, "b": 12, "c": 11}


print(max(nums, key = lambda k: nums[k] ))  # >>> b
# 同理:最小值的key 和 根据值大小将key排序如下:
print(min(nums, key = lambda k: nums[k])) # >>>a
print(sort(nums, key = lambda k: nums[k], reverse = True)) # >>>['b', 'c', 'a']

 

posted @ 2020-06-19 22:50  不负韶华l  阅读(272)  评论(0编辑  收藏  举报