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


    一、函数递归

      递归:函数在调用阶段直接或间接地又调用了自身。

      递归分为两个阶段:

        1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降,直到有一个最终的结束条件。

        2.递推:一次次往回推导的过程。

      函数不应该无限制的递归下去,必须要有结束条件,否则会造成内存溢出,而Python解释器不允许这种情况的出现,所以它设置了一个最大递归深度,当递归层数达到最大递归深度时,Python解释器会终止递归,并报错。

    在调用函数是超出了最大递归深度
    
    #系统默认次数是1000
    
    import sys
    print(sys.getrecursionlimit())
    
    >>>1000
    -------------------------------------------
    #可修改
    import sys
    sys.getrecursionlimit(2000)
    
    >>>2000  

    二、算法之二分法 

      先将一个容器类型,分割一半看是否大于或者小于,然后分割出来,进行运算,二分法用于查找数据时,需要将给定的数据事先排好顺序(假设由小到大排序)并放在一个列表中,然后找出中间值,将中间值与要查找的值比较,如果相等则找到,如果比要查找的值大,则说明要查找的值在列表的左边,就取左边,如果比要查找的值小,则说明要查找的值在列表的右边,就取右边。然后重复操作,直到找到该数值。

    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)

    三、三元表达式

      三元表达式固定表达式
        值1 if 条件 else 值2
        条件成立 值1
        条件不成立 值2

      三元表达式应用场景:只推荐只有两种的情况的可能下

    如:a=5 ,b =6,比较两个数大小
    
    res = a if a>b else b  等同于   
    
    if a>b:
    
      print(a)
    
    else:
    
      print(si)

    四、列表生成式

      列表生成式:[放入列表的元素(可以对这个元素进行一些操作,比如字符串的拼接或者数学运算) for循环一个容器类型,取出里面的元素 if 条件(这个条件可加可不加,加的话条件成立才取出该元素,不成立直接丢掉)]

    l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
    # 列表生成式
    # res = ['%s_DSB'%name for name in l]
    # print(res)
    
    res = [name for name in l if name.endswith('_sb')]  # 后面不支持再加else的情况
    # 先for循环依次取出列表里面的每一个元素
    # 然后交由if判断  条件成立才会交给for前面的代码
    # 如果条件不成立 当前的元素 直接舍弃
    
    print(res)

    五、字典生成式

      与列表生成式类似,不同的是用大括号括起来

      需求:将 l1 = ['name', 'age', 'hobby'] , l2 = ['jason', 18, 'DBJ'] 两个列表分别作为键值组成一个字典

    l1 = ['name', 'age', 'hobby']
    l2 = ['jason', 18, 'DBJ']
    
    # for 循环利用字典特性生成字典
    d = {}
    for i in range(len(l1)):
        d[l1[i]] = l2[i]
    print(d)
    # {'name': 'jason', 'age': 18, 'hobby': 'DBJ'}
    
    # 利用内置函数 zip,将 l1与l2 组合成元组,然后利用内置函数dict强转成字典
    d1 = dict(zip(l1, l2))
    print(d1, zip(l1, l2))
    # {'name': 'jason', 'age': 18, 'hobby': 'DBJ'} <zip object at 0x00000248171F21C8>
    
    # d2 将l1 与 l2 中的各元素分别作为键值组成一个新的字典,过滤掉 age 这一个键值   ---> 字典生成式
    d2 = {k: v for k, v in zip(l1, l2) if k != 'age'}
    print(d1, d2)
    # {'name': 'jason', 'age': 18, 'hobby': 'DBJ'} {'name': 'jason', 'hobby': 'DBJ'} 

    六、匿名函数

      匿名函数:没有名字的函数

      特点:临时存在,调用完立即销毁

      关键字:lambda

    print(lambda x, y: x + y)
    # <function <lambda> at 0x000001DAC45B2E18>
    print((lambda x, y: x + y)(1, 3))
    # 4
    

      冒号的左边相当于函数的形参,冒号的右边相当于函数的返回值.

    七、内置函数(部分)

      1、max(),括号内可以放入多个值或一个容器类型,它的内部是基于for循环的,依次取出各个元素进行比较,返回最大值,如果这些值都是字符串,那么就是比较这些字符串的首字母在ASCII码表中对应的数字,A-Z对应65-90,a-z对应97-122。同时max()还可以传入第二个参数,一般情况下传入的是匿名函数。

    # 比较薪资,返回人名
    d = {
        'egon': 30000,
        'jason': 88888,
        'nick': 3000,
        'tank': 1000
    }
     
    print(max(d, key=lambda name: d[name]))
    

      2、map()函数,映射函数:可以传入两个参数,第一个是匿名函数,第二个是一个容器类型,map()基于for循环将容器类型内的参数依次取出交给匿名函数,处理完后交给map函数,它的返回值是一个老母猪,可以利用for循环将里面的值取出来。

    # map 映射
    l = [1,2,3,4,5,6]
    print(map(lambda x:x+5,l))  # 基于for循环
    # <map object at 0x01541250>
    

      3、zip()函数,拉链函数:可以将任意多的容器类型里面的值按照索引组合在一起,将相同索引的元素放在同一个元组中,元组的个数由长度最小的容器类型的长度决定,容器类型的长度不一致也不会报错。

    l1 = [1,2,3,4]
    l2 = ['jason','egon','nick','tank']
    res = zip(l1,l2)
    res1 = list(res)
    print(res)
    print(res1)
    # 输出
    # <zip object at 0x02B066C0>
    # [(1, 'jason'), (2, 'egon'), (3, 'nick'), (4, 'tank')]
    

      4、sorted()函数,排序函数,默认从小到大排序,指定reverse = True时从大到小排序

    l = ['jason','egon','nick','tank']
    print(sorted(l,reverse=True))
    # ['tank', 'nick', 'jason', 'egon']
    

      5、reduce()函数,需要导入reduce模块

    from functools import reduce
     
    l = [1, 2, 3, 4, 5, 6]
    print(reduce(lambda x, y: x + y, l))  # 21
    print(reduce(lambda x, y: x + y, l, 19))  # 40

      当初始值不存在的情况下,第一次先获取两个元素相加,之后每次获取一个与上一次相加的结果相加

      当初始值存在的情况下,第一次取出一个值与初始值相加,之后每一次获取一个值与上一次相加的结果相加。

     

    生前无需久睡,死后自会长眠,努力解决生活中遇到的各种问题,不畏将来,勇敢面对,加油,你是最胖的,哈哈哈
  • 相关阅读:
    java 学习进度二
    java 学习进度一
    Lua 笔记17
    chrome浏览器扩展的事件处理
    指定的参数错误。Vim.Host.DiskPartitionInfo.-spec VSPHERE.LOCALAdministrator WIN-DOPGQVRRU2C
    MySQL分区表
    MySQL绿色版的安装(mysql-5.6.22-win32.zip)
    Oracle操作语言分类
    注册表法修改IE8安全级别的方法
    JDK版本不兼容问题之:一台机器安装多个版本的JDK
  • 原文地址:https://www.cnblogs.com/panshao51km-cn/p/11182951.html
Copyright © 2020-2023  润新知