zoukankan      html  css  js  c++  java
  • 二:函数递归,匿名,表达式

    总结:
    今日内容:
        函数递归  ******
        算法之二分法
        生成式     *****
        匿名函数        ***
        常用的内置函数      ****
       
       
        一:函数递归(函数不能无限制的递归下去,无任何意义)
                了解:在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  过滤
     
  • 相关阅读:
    TextVew中文空格
    java中String字符串的替换函数:replace与replaceAll的区别
    朝花夕拾
    Eclipse启动时卡死在"Android SDK: Resolving error markers"的解决方法
    签名“未签名”apk文件命令
    TODO
    完全卸载AndroidStudio
    Gradle
    经受时间沉淀的15 个 Android 通用流行框架大全
    jquery 获取 新添加元素 点击后 的子元素
  • 原文地址:https://www.cnblogs.com/Fzhiyuan/p/11178445.html
Copyright © 2011-2022 走看看