zoukankan      html  css  js  c++  java
  • 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']
  • 相关阅读:
    PerfDog携手Imagination,助力开发者获取GPU关键数据
    WeTest云手机升级,支持iOS 15全新系统
    洞穿性能测试痛点,PerfDog以提升应用和游戏的品质为使命
    使用xmlhttprequest遇到CORS报错的处理
    Hive的联级(cascade)-新增字段(column)后,旧分区无法更新数据问题
    数据异常检测入门
    Linux查看文件或文件夹大小: du命令
    k8s pod自动重启原因(jvm内存设置)
    计算容器运行至今多长时间
    期刊论文在线投稿审稿系统day1数据库设计
  • 原文地址:https://www.cnblogs.com/cui-cheng/p/13166829.html
Copyright © 2011-2022 走看看