• 2019-07-12 函数递归、二分法、匿名函数、三元表达式、内置函数


    一、递归函数

      我理解为递归函数也是函数嵌套的一种,函数在调用时,直接或间接的调用了自身。

      简单的直接调用本身(这种调用会一直循环下去,会很占内存空间,所以python解释器为了防止无限占用内存,对这种循环做出了限制,循环到一定程度就会自动停止)

    def f1():
        print('f1')
        f1()
    f1()

      递归调用分为两个阶段:回溯、递推

      回溯:回溯是外层向里一层层调用下去。回溯阶段必须要有一个明确的结束条件,每次进入下一次递归,问题的复杂度都应该降低(否则,单纯的重复调用自身是毫无意义的)

      递推:递推是里层向外一层层结束递归

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

    递归函数不需要考虑循环的次数,只需要把握结束的条件

    二、算法之二分法

      算法:快速高效的解决问题的方法

      有这样一个列表 l =[1,2,3,4,5,6],假如你需要找到数字6,我们之前的做法是for循环所有数字,然后比较。这种做法对小数据还好,如果是很大的数据,我们要查找的数据还在最后一个,如果我们用for循环的方法查找就很影响效率。所以这里我们用二分法。

    l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
    
    #快速找到345
    tag_num = 344
    def get_num(l,tag_num):
        #判断如果没有这个数字
        if not l:
            print('没有这个数字')
            return
        #我们先需要把列表从小到大排序
        l.sort()
        print(l)
        #我们先用len的方法先获取中间值的索引
        num_index = len(l)//2
        #进行比较,如果目标数大于中间数,就往右边找
        if tag_num > l[num_index]:
            #把右边的所有数字用切片的方式截取出来
            num = l[num_index+1:]
            get_num(num,tag_num)    #然后我们把右边截取出来的列表再从中间分开,接下来的步骤就是重复的
        #截取左边的数字
        elif tag_num < l[num_index]:
            num = l[0:num_index]
            get_num(num,tag_num)
        else:
            print('find it')
    
    get_num(l,tag_num)
    二分法快速找到列表中的数字

    三、三元表达式

      三元表达式固定表达式:

      值 1 if 条件 else 值 2

        条件成立   值1

        条件不成立  值2   

      x > y条件成立就返回x 

    x = 99999
    y = 9898898
    res = x if x > y else y
    print(res)

        三元表达式不建议嵌套使用,推荐在只有两种情况下使用,嵌套多了容易出错

    四、列表生成式

    #原始方法,往列表中的每个元素末尾都加上_sb
    l = ['tank','nick','oscar','sean']
    l1 = []
    for name in l:
        l1.append('%s_sb'%name)
    print(l1)
    
    #列表生成式的方法做
    l = ['tank','nick','oscar','sean']
    #for循环先取出每个元素i,然后在每个元素后面加_sb,字符串拼接
    res = [ '%s_sb' %i for i in l]
    print(res)     #['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

      先for循环取出列表中的每一个元素,然后交给if判断,符合要求的才会交给for前面的代码,如果条件不成立当前的元素直接舍弃。

    l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
    #每个元素取出来,末尾以_sb结尾的才符合要求加入到列表中
    res = [i for i in l if i.endswith('_sb')]
    
    print(res)

    五、字典生成式

    l1 = ['jason','123','read']
    d = {i:j for i,j in enumerate(l1) if j != '123'}   #j不符合,i也会删除
    print(d)    #{0: 'jason', 2: 'read'}
    
    #集合生成式
    res = {i for i in range(10) if i!=3}   #条件i不等于3就是成立
    print(res)    #{0, 1, 2, 4, 5, 6, 7, 8, 9}
       res1 = (i for i in range(10) if i != 4)  # 这样写不是元组生成式 而是生成器表达式

    六、匿名函数    没有名字的函数

      语法:

            lambda   参数列表:表达式

      匿名函数的特点:临时存在用完就没了

      x,y可以当做函数的形参,x+y可以当做函数的返回值。匿名函数通常不会单独使用,一般会和内置函数一起使用

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

    七、内置函数

      max ()  返回最大值    内部是基于for循环的      min()返回最小值

    #简单的
    l = [1,2,3,4,5]
    print(max(l))
    
    
    #字典根据最大的value返回对应的key
    d = {
        'egon':30000,
        'jason':88888888888,
        'nick':3000,
        'tank':1000
    }
    print(max(d))   #因为max也是基于for循环的,这个只会返回key
    
    res = max(d,key=lambda name:d[name])
    print(res)  #jason    #max还有一个参数,key写函数根据value来排大小,返回的值是d 
    map zip filter sorted reduce

      map()   映射  将传入的函数依次作用到序列的每个元素

      这个匿名函数功能是每个元素都加5,然后放在一个列表中

    l = [1,2,3,4,5,6]
    
    print(list(map(lambda x:x+5,l)))    #[6, 7, 8, 9, 10, 11]

      zip()   拉链(配对)  如果少了,会匹配最短的那个个数

    l1 = [1,2,]
    l2 = ['jason','egon','tank']
    l3 = ['a','b','c']
    print(list(zip(l1,l2,l3)))    #[(1, 'jason', 'a'), (2, 'egon', 'b')]

      filter()   过滤  基于for循环   把不符合的去掉

    l = [1,2,3,4,5,6]
    res = filter(lambda x:x!=3,l)
    print(list(res))     #[1, 2, 4, 5, 6]

      sorted()  排序     后面加了reverse就是反转

    l = [1,2,3,4,5,6]
    res = sorted(l,reverse=True)
    
    print(res)    #[6, 5, 4, 3, 2, 1]

      reduce()   序列求和    必须包含两个参数,一个是函数,一个是序列,后面如果再加参数就当初始值和序列中的数相加。

    from functools import reduce
    l = [1,2,3,4,5,6]
    print(reduce(lambda x,y:x+y,l,19))   #40
    #这里初始值是19,第一次先获取两个元素的和19和1,之后每获取一个与上一次相加的结果再相加
  • 相关阅读:
    表的创建与管理
    以传值和传引用的方式传递参数 IN OUT NOCOPY
    PLSQL中的三种参数模式IN、OUT、IN OUT
    用python写GPU上的并行计算程序,有什么库或者编译器?
    cupy中tensor数据类型与numpy以及pytorch中相互转换
    c++ string split
    Java 读取大文件
    Linux 使用系列
    安装以太坊环境
    服务器排查问题相关命令
  • 原文地址:https://www.cnblogs.com/wangcuican/p/11177312.html
Copyright © 2020-2023  润新知