• 函数递归、二分法、三元表达式、列表表达式、字典表达式、匿名函数以及常用内置函数


    1 什么是函数递归
    函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身

    递归就是一个重复的过程,自己调用自己:

    写一个死循环

    def bar():
        print('from bar')
        foo()
    def foo():
        print('from foo')
        bar()
    bar()
    #代码报错。超过系统最大深度

    写一个简单的递归:

     def bar():
         print('from bar')
         foo()
    
     def foo():
         print('from foo')
         bar()

    递归的应用场景:

    只知道最后一个人的年龄,依次推测年龄

    def age(n):
         if n == 1:
             return 26
         return age(n-1) + 2
    print(age(5))

    写出递归的一个总结:明确递归的概念,递归就是自己调用自己。先写一个基本的循环,然后再明确一个结束的条件。

    查看系统默认内递归的最大层数:

    import sys
    print(sys.getrecursionlimit())#大概在998左右

    手动指定递归的最大深度:

    sys.setrecursionlimit(3000)

    手动通过递归函数查看最大深度:

    def func1(n):
        print('from func1',n)
        func1(n+1)
    func1(1)

     循环打印取出嵌套列表中的值

    l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
    l1=[]
    def num(l):
        for i in l:
            if type(i) is int:
                l1.append(i)
            else:
                num(i)
    num(l)
    #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

    两种函数顶替的方式:

    1.pas 2....(英文状态下的三个省略号)

    def index():
        pass
    index
    def index():
        ...
    index

    总结:

    递归必须要有两个明确的阶段:
    递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
    回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推
    开始一层一层回溯
    递归的精髓在于通过不断地重复逼近一个最终的结果

    二、二分查找算法

    二分查找算法 必须处理有序的列表

    三、三元表达式:就是一个简写形式

    三元表达式仅应用于:
    1、条件成立返回 一个值
    2、条件不成立返回 一个值
    res=x if x > y else y
    print(res)

    三元表达式前的引导:

    def max(x,y):
        if x>y:
            return x
        else:
            return y
    res=max(10,20)
    print(res)

    三元表达式为:res= x if x>y else y

    def max2(x,y):
        return x if x>y else y
    print(max2(10,11))

    四、列表生成式

    和三元表达式一样都是个简写的过程

    首先,给一个列表中的每个值加上‘_sb’的字样

    看看无列表生成式的样子:方法1 

    l=['wuxi','sll','zdq','abc']
    a=[]
    for i in l:
        a.append('%s_sb'%i)
    print(a)

    先定义一个空列表。然后循环取值,将通用格式:i_sb用格式化输入的方式写入新的列表

    方法2:

    a.append(i+'_sb')

    列表生成式是如何简写的

    l=['wuxi','sll','zdq','abc']
    res=['%s_DSB'%name for name in l ]
    print(res)
    #把循环出来的每一个值赋值给前面的name

    列表生成器挑选后缀是_NB的人。注意for后面的name和赋值的name是同一个。

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

     

     注意,加IF判断的列表生成式不支持加else的情况

    五、字典生成式

    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ','egon']

    顾名思义就是生成字典。在案例中将两个列表的值一一对应放入字典中。

    思路:将两个列表中的值取出来,再存入字典。

    for循环取值l1的值,然而还需取l2的值,想到enumerate的作用是for循环取值的同时可以打印对应的索引,而该索引也可以用在l2上,最后通过d[k]=value的形式为字典赋值

    d={}
    for j,k in enumerate(l1):
        d[k]=l2[i]
    print(d)

    字典生成式

    res={i,j for i,j in enumerate(l1)}

    print(res)

    字典生成式排除列表的某一项

    res={i:j for i,j in enumerate(l1) if j !='name'}
    print(res)

    但此时的字典和以前不一样。

    六、匿名函数

    没有名字的函数。用于临时使用,用完就清除

    一般函数形式:(写一个相加函数)

    def sum(x,y):
        return x+y

    用匿名函数来写:

    与列表、字典生成式相同,都需要一个变量来接收返回值
    lamdba函数的写法是写成一行
    res=(lamdba x,y :x+y)
    print(res)
    匿名函数的执行代码
    执行lamdba函数只需在后面加括号以及参数即可
    res=(lamdba x,y :x+y)(10,20)#别忘了lamdba也是函数,加括号就可以调用
    print(res)

    也就是说,平时函数怎么写,匿名写法也是一样,知识写成一行,调用写在后面即可

     注意:匿名函数需要和内置函数一同使用。

    补充一个知识点:A—Z(65,90),A的arsic码最小

    a—z(97,122)a的arsic码最小。通过如下方法可以查询

    下面就是一些内置函数。

    七、内置函数

     map映射

    l = [1,2,3,4,5,6]
    # print(list('hello'))
    print(list(map(lambda x:x+5,l)))  # 基于for循环

    zip拉链

    filter过滤。从列表中获取值,再过滤

    sorted排序。

    reduce

  • 相关阅读:
    [Luogu P4178]Tree 题解(点分治+平衡树)
    [20190725NOIP模拟测试8]题解
    暑假集训考试反思+其它乱写
    [bzoj2752]高速公路 题解(线段树)
    bzoj1211树的计数 x bzoj1005明明的烦恼 题解(Prufer序列)
    [CQOI2014]数三角形 题解(找规律乱搞)
    [Catalan数三连]网格&有趣的数列&树屋阶梯
    [NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)
    [7.22NOIP模拟测试7]方程的解 题解(扩展欧几里得)
    leetcode371
  • 原文地址:https://www.cnblogs.com/ZDQ1/p/11176509.html
Copyright © 2020-2023  润新知