二:函数递归,匿名,表达式

总结:
今日内容:
    函数递归  ******
    算法之二分法
    生成式     *****
    匿名函数        ***
    常用的内置函数      ****
   
   
    一:函数递归(函数不能无限制的递归下去,无任何意义)
            了解:在python中最大递归深度为1000,或者988左右,是python自己处理好的,最大递归深度也可更改
            概念:函数在调用阶段直接或间接的又调用自身
            递归分为两个阶段:
                            1,回溯:由未知条件向已知条件推导的过程,是重复的问题复杂度越来越低的过程
                            2,递推:一次次往回推导的过程
            总结:递归函数不要考虑循环多少次,只需要把握结束条件
                  即必须要有结束条件
            案列:
                l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12]]]]]]]]]]]]
                # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)
                def get_num(l):
                    for i in l:#循环取出列表中中的值
                        # print(i,type(i))     #此时的i 为两个值,1和列表,因为大列表中包含1和一个列表,共两个元素
                        if type(i) is int:   # 若循环得到的i为 int 类型 则打印
                            print(i)
                        else:               # 如果不是则继续调用函数         **************************
                            get_num(i)      #  此时函数括号中的实参为一个列表 ,此列表i中又包含一个字符和一个列表    ***********************
                get_num(l)      结果为:1 2 3 4 5 6 7 8 9 10 11 12
                案列总结:l,列表中包含一个int的字符和一个列表,共两个 ‘元素’
                            通过for循环得到的结果 也是一个int型字符 和一个列表
                            然后判断的到的字符的类型,如果为int型,就是结果,复杂度又少了一层
                            依次类推,最后循环取出所有符合要求的值
                    注意:else         后面的代码,
                          get_num(i)   此时函数括号中的实参为一个列表 ,此列表i中又包含一个字符和一个列表
                解题思路:1,对容器进行for循环取值,理清取出来的值是什么,和是什么类型,
                          2,提出条件,即判断条件语句,执行满足条件的代码
                          3,不满足条件,拿到不满足条件,对其进行分析类型和,让后传参给函数,继续执行
                                间接或直接的调用自身

    二:函数之二分法:(解决问题的高效的方法)
                    容器里面的数字必须有大小数字
                    (提高效率,减低取值或者操作的次数,快速达到想要的结果)
                案例:
                    判断或取值的列子
                        target_num = 45
                        l = [1,2,3,4,5,6,7,8,9,22,12,34,45,56,67,78,]
                        l.sort(reverse=False)  #[1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 22, 34, 45, 56, 67, 78]
                        def get_num(l,target_num):  #注意传的参数
                            if not l:
                                print('列表不存在')
                                return
                            # 获取列表中间的索引
                            msg_index = len(l)//2    #整除   例子:r = [1,2.3,4,5]   print(len(r)//2)   =》2
                            # 判断target_num 的值和列表中间索引对应值的大小
                            if target_num >l[msg_index]:
                            #将列表进行切片,切取列表右半部分
                                num_rigit = l[msg_index + 1:]   #注意要加一  索引右边开始一直到最后,即列表后半段
                                #再次递归调用get_num
                                get_num(num_rigit,target_num)  #再次调用 注意括号中的是列表和你给的参数
                            elif target_num < l[msg_index]:      #前半段列表
                                # 切取列表左半部分
                                num_left = l[0:msg_index]
                                # 递归调用
                                get_num(num_left,target_num)
                            else:
                                print('找到了!',target_num)  #注意在这里是变量名,不加双引号
                        get_num(l,target_num)
    三:三元表达式:
                         值1 if 条件 else 值2
                            条件成立   值1
                            条件不成立   值2
                        案列:
                            x = 22222
                            y = 111111
                            res = x if x > y else y
                            # 如果if后面的条件成立返回if前面的值 否则返回else后面的值
                            print(res)
        列表生成式:
                        l = ['w1_sg','www_sg','sd','w12']
                        res = [name for name in l if name.endswith('_sg') ]     # 后面不支持再加else的情况
                        print(res)
                        先for 循环依次取出列表里的每一个元素
                        然后交由if判断 条件成立才会交给for前面的代码
                        如果条件不成立 当前的元素就直接舍弃
                         res = ['%s_DSB'%name for name in l]    增加
        字典生成式  注意
                    ....l1 = ['jason','123','read']
                        d = {i:j for i,j in enumerate(l1) if j != '123'}
                        print(d)   # {0: 'jason', 2: 'read'}
                    案列:
                    res = {i for i in range(10) if i != 4}
                    print(res)   #{0, 1, 2, 3, 5, 6, 7, 8, 9}
    四:匿名函数
                没有名字的函数
            特点:临时存在用完就没了
                关键字:(lambda 参数1,参数2:返回值)(参值1,参值2)
                注意::(冒号)左边的相当于函数的形参
                        :(冒号) 右边相当于函数的返回值
                    匿名函数通常不会单独使用,是配合内置函数一起使用的
            案例:res = (lambda x,y:x+y)(1,2)
                  print(res)     答案为 3
    五:常用内置函数
             map zip filter sorted reduce
             map 映射
                    l = [1,2,3,4,5,6]
                    print(list(map(lambda x:x+5,l ))) 基于for循环   #[6, 7, 8, 9, 10, 11]   l是列表名
             zip 拉链     基于for循环
                    有多少拉多少与之都匹配的
                    l1 = [1,2,]
                    l2 = ['jason','egon','tank']
                    l3 = ['a','b','c']
                    print(list(zip(l1,l2,l3)))   #[(1, 'jason', 'a'), (2, 'egon', 'b')]
            filter  过滤
                    l4 = [1,2,3,4,5,6]
                    print(list(filter(lambda x:x == 3, l4)   # 基于for循环   过滤掉不是3的字符
            sorted   反转
                    l5 = ['jason','egon','nick','tank']
                    print(sorted(l5,reverse=True))     # 反转降序,按首字母  ['tank', 'nick', 'jason', 'egon']
            reduce          ************************
                   案列:
                    from functools import reduce
                    l = [1,2,3,4]
                    print(reduce(lambda x,y:x+y,l,))   #12 为初始值  ,即第一个参数次      结果位22
                    如果初始值不存在,则按照下面的规律:
                              第一次先获取两个元素相加
                               之后每次获取一个与上一次相加的结果再相加       此题为 10
补充(了解)
一:递归深度: 
# import sys
# print(sys.getrecursionlimit())  # 不是很精确   获取递归深度
# sys.setrecursionlimit(2000)      更改递归深度
二:注释方式:
# def index():
    # pass  # 第一种顶替方式(推荐使用pass)
    # ...  # 第二种顶替方式
1,排序:reverse=True   为倒序  即降序
        reverse=Flase  为顺序  即升序
        l.sort(reverse=True)   把列表中的字符按降序排
2,字符编码对应关系:
            a-z  97 122
            A-Z  65 90
        print(chr(97))  为 a
3,单词:iterable  可迭代
        filter  过滤
 
原文地址:https://www.cnblogs.com/Fzhiyuan/p/11178445.html