• 函数递归和一些常用的内置函数


    一、函数的递归

     1、定义: 函数在调用阶段直接或间接的又调用自身

        2、形式

     def func(n):
    #     print('from func',n)
    #     func(n+1)
    #
    # func(1)

    #可以返回998行

    3、import sys 模块

    获取的递归的限制不是很精确

    import sys
    # print(sys.getrecursionlimit())  # 不是很精确

    还可以通过 sys.setrecursionlimit(2000)
    来修改递归的次数,但是这样是没有意义的,不应该无限制的递归下去

    4、递归的应用场景

      分为另两个阶段

              1、回溯:就是一次次重复的过程,但是这个重复的过程建立在每一个重复             问题的复杂程度应该下降,直到有一个最终的结束条件

              2、递推:一次次往回推导的过程

    5、应用

    1、猜年龄游戏

    ‘’’
    age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 18
    ‘’’
    # 已知age(1),求age(5),由上式,可以总结出 当 n >1时 age(n) = age(n-1)+2
    当n= 1时 age(1)= 18

    #代码
    def age(n):
         if n == 1:  # 必须要有结束条件
             return 18
         return age(n-1) + 2
    res = age(5)
    print(res)
    #

    2、将列表的数字打印出来

    l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13]]]]]]]]]]]]]  #将列表中的数字依次答应出来

    #第一种方式 用for 循环可以写,但是如果层数太多的话 代码就会冗余。
    for i in l:  推导思路
         if type(i) is int:
             print(i)
         else:
             for item in i:
                 if type(item) is int:
                     print(item)
                 else:
                     for j in item:
                         if type(item) is int:
                             print(item)
                         else:
                 ...

    #第二种方式,用递归函数写
    def get_num(l):
         for i in l:
             if type(i) is int:
                 print(i)
             else:
                 get_num(i)

    # get_num(l)
    l1 = []
    for i in l1:
         print(i)
    #递归函数不要考虑循环的次数 只需要把握结束的条件即可

    3、算法之二分法

    算法的定义:解决问题的高效率的方法

    二分法的定义:就是先找到容器类型中的中间值,然后拿需要比的值和中间值比较。大于中间值就选右边,小于就取左边。然后继续取中间值,直到取到为止。且容器类型里面的数字必须有大小顺序。

    l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
    target_num = 666
    def get_num(l,target_num):
        if not l:
            print('你给的工资 这个任务怕是没法做')
            return
        # 获取列表中间的索引
        print(l)
        middle_index = len(l) // 2
        # 判断target_num跟middle_index对应的数字的大小
        if target_num > l[middle_index]:
            # 切取列表右半部分
            num_right = l[middle_index + 1:]
            # 再递归调用get_num函数
            get_num(num_right,target_num)
        elif target_num < l[middle_index]:
            # 切取列表左半部分
            num_left = l[0:middle_index]
            # 再递归调用get_num函数
            get_num(num_left, target_num)
        else:
            print('find it',target_num)
    
    get_num(l,target_num)

    四、三元表达式

    应用场景  :

        当某个条件成立做一件事情,不成立做另一件事情。

    形式

      

    x = 99999
    y = 9898898
    res = x if x > y else y      # 如果if后面的条件成立返回if前面的值 否则返回else后面的值
    print(res)

    固定格式:
            值1 if 条件 else 值2
                条件成立 值1
                条件不成立 值2

    使用规范

        三元表达式的应用场景只推荐只有两种的情况的可能下,因为写太多就不容易看清楚     

    五、列表生成式

    l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
    # 列表生成式
    res = [name for name in l if name.endswith('_sb')]  # 后面不支持再加else的情况
    # 先for循环依次取出列表里面的每一个元素
    # 然后交由if判断  条件成立才会交给for前面的代码
    # 如果条件不成立 当前的元素 直接舍弃

    六、字典生成式

    和列表生成式差不多,就是把中括号改成大括号

    res = {i for i in range(10) if i != 4}
    print(res)
    res1 = (i for i in range(10) if i != 4)  # 这样写不是元组生成式 而是生成器表达式

    七、匿名函数

    定义:没有名字的函数

    特点:临时存在用完就没了

    关键字:lambda

    def my_sum(x,y):
        return x + y
    
    # res = (lambda x,y:x+y)(1,2)
    # print(res)
    # func = lambda x,y:x+y
    # print(func(1,2))
    
    
    
    # :左边的相当于函数的形参
    # :右边的相当于函数的返回值
    # 匿名函数通常不会单独使用,是配合内置函数一起使用

    八、常用的内置函数

    max map zip

    max 求最大值

    map 会根据提供的函数对指定序列做映射。

    第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

    zip  将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

    filter     用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

  • 相关阅读:
    如何在自定义端口上运行 Spring Boot 应用程序?
    FileUpload拦截器
    UI标签
    OGNL
    你对测试最大的兴趣在哪里?为什么?
    举例说明同步和异步。
    git 克隆分支
    JQuery 选择器
    JQuery对象和Dom对象
    简单的JQuery之Ready
  • 原文地址:https://www.cnblogs.com/panyi2019/p/11178548.html
Copyright © 2020-2023  润新知