zoukankan      html  css  js  c++  java
  • 递归 三元表达式 列表字典生成式 匿名函数 常用内置函数

    递归

    递归就是按照一系列相同的步骤做一件事  例如询问年龄,问 a 年龄  a 说 a比b大2岁 这样一说当然会去问b,b也说  b比c大2岁以此类推c,d都说比后面的大2岁,直到问道了e,e说他20,那么按照刚才的推理过程在返回去,自然能退出a是28岁

    这个过程就是一个很明显的递归过程,其中,询问年龄的过程就是回溯,得到e结果之后的推算a的过程就是递推

      回溯:一次次的冲福某一个同样的动作,这个重复的动作必须的是一样的,类似刚才的都大2岁

      递推:一次次的反推的过程

    def my_age(n):
        if n == 1:         
            return 30
        return my_age(n-1)+2
    print(my_age(5))  38 
    
    n等于1 就是相当于 问到e同学是30岁    之后一步步回推   递加2  递加4次则得出 第五次是38

    l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
    #  将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)
    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:
                            ...  # 相当于pass  不报错   顶包  推荐使用pass
    
    
    这样子做的弊端就是要取出多少数据,就要重复多少次,这样首先造成了代码的冗余,其次就是太low
    l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
    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)
    递归

    算法:二分法

    算法:可以高效的解决问题     注意   二分法容器类型必须是有大小顺序的   如原来列表是无序的那么要先排序

    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)
    View Code

    三元表达式

    if的另外一种形式 (一行实现if代码)

    应用场景:只有两种结果的情况  不支持嵌套  就是当值1成立 的时候就执行条件1 否则就是执行值2 
    写法              值1 if条件 else 值2 

    条件成立走1   不成立走2

    lis = ['林xx','苏xx']
    print(lis,'可以是其他任何名字')
    name = input('输入一个名字>>>:')
    res = '长得丑' if name in lis else '长得帅'
    print(res)

    列表生成式

    先for循环以依次取出列表内部的元素
    进行if判断 条件成立将结果交给for之前的代码,条件不成立 当前元素 直接不要了

    写法    变量名 for 变量名 in 列表名 if 变量名 判断条件    后面不支持加else

    如果上述结果需要输出就整体附一个变量名打印一下

    l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
    res = [name for name in l if name.endswith('_NB')]
    print(res)  # ['jason_NB']

    字典生成式

    l1 = ['jason','123','read']
    d = {i:j for i,j in enumerate(l1) if j != '123'}    
    print(d)

    与列表不同的是
      括号的使用是{}
      for之前的是键值对形式 原理都是先for循环取值 在根据条件将值交给for之前的

    匿名函数

    正如这个函数的名字一样,他是一个没有名字的函数     还有就是他使用了马上就没了    只有用的时候才存在

    写法    (lambda 值1,值2:值1 条件 值2)(参数1,参数2)          附一个变量名打印 

    两个数相加

    res = (lambda x,y:x+y)(1,2) print(res) func = lambda x,y:x+y print(func(1,2))

    # 冒号  左边的相当于函数的形参
    # 冒号  右边的相当于函数的返回值
    # 匿名函数通常不会单独使用,是配合内置函数一起使用

    dic = {
    'eee':10000,
    'jasom':1000,
    'nice':100,
    'tura':10
    }
    # 比较 他们的value  取出他们的key值
    print(max(dic,key=lambda name:dic.get(name))) # eee

    print(min(dic,key=lambda name:dic.get(name))) # tura

    常用内置函数

    内置函数,就是pycharm已经包装好的函数,当python解释器打开的时候就可以直接调用了

    常用的几个内置函数 map  zip  filter sortted  reduce

    map  映射    列表内每一个元素都发生变化   基于for循环     先将每一个元素遍历出来

    l = [1,2,3,4,5,6]
    # print(list('hello'))
    print(list(map(lambda x:x+5,l)))  # 将每个元素+6

    zip  拉链    列表

    l1 = [1,2,]
    l2 = ['jason','egon','tank']
    l3 = ['a','b','c']
    print(list(zip(l1,l2,l3)))  # [(1, 'jason', 'a'), (2, 'egon', 'b')]
    
    将三个列表的值以元组的形式按照所用放在一起    但是发现l1中只有两个元素
    所以他会将三个列表中都有对应值的组合在一起   没有的直接不要了

    filter

    l = [1,2,3,4,5,6]
    print(list(filter(lambda x:x != 3,l)))  # [1, 2, 4, 5, 6]
    
    首先是基于for循环的    将等于3 的那个元素剔除

    sorted  排序

    l = ['jason','egon','nick','tank']
    print(sorted(l,reverse=True))  # ['tank', 'nick', 'jason', 'egon']
    
    
    默认是升序    当reverse=Ture是  改为降序

    reduce   

    # 当初始值不存在的情况下 按照下面的规律
    # 第一次先获取两个元素 相加
    # 之后每次获取一个与上一次相加的结果再相加

    from functools import reduce
    l = [1,2,3,4,5,6]
    print(reduce(lambda x,y:x+y,l,19))  # 19初始值  第一个参数
  • 相关阅读:
    【洛谷P3389 【模板】高斯消元法】
    清北学堂培训2019.4.7
    清北学堂培训2019.4.6
    清北学堂培训2019.4.4
    个人对于数论的一点整理
    【洛谷P1134 阶乘问题】
    【洛谷P1313 计算系数】
    【洛谷P2822 组合数问题】
    【NOIP数论内容整理】
    特斯拉全自助驾驶芯片初始Meet Tesla FSD SoC
  • 原文地址:https://www.cnblogs.com/xuzhaolong/p/11177420.html
Copyright © 2011-2022 走看看