• day12 -- 函数递归、生成式、匿名函数和常用内置函数


    目  录

    一、函数递归

    二、三元表达式、列表,字典生成式

    三、匿名函数

    四、常用内置函数

    一、函数递归

    函数的递归:函数在调用阶段直接或间接的又调用自己。

    函数递归的两个阶段:

      回溯:就是一次次的重复过程,在每一次重复时都会降低问题的复杂度,直到一个最终的条件。

      递推:就是往回推导的过程。

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

    递归函数不需要考虑循环的次数,只需要考虑终止的条件即可。

    算法:就是使程序高效率执行的方法。

    示例:二分查找法--使用递归函数

    空函数函数体的替代方法:

    def index():
         # pass  # 第一种顶替方式(推荐使用pass)
         # ...  # 第二种顶替方式

    二、三元表达式、列表,字典生成式

    三元表达式固定公式:

    """"
    三元表达式公式:
    值1 if 条件 值2
        条件成立 值1
        条件不成立 值2
    """
    # l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
    
    def get_num(x):
        for i in x:  # 这里边的X指得是get_num 里面的形参,所以两者要对应
            if type(i) is int:
                print(i)
            else:
                get_num(i)
    get_num(l)
    示例
    # list = [1,3,5,12,57,89,101,103,147,167,179,189,345]
    
    def get_num(x,y):
        mid = len(y) // 2  # 中间位置索引
        if x > y[mid]:
            r_li = y[mid+1:]
            get_num(x,r_li)  # 函数无论何时在何处调用都要看有没有添加参数
        elif x < y[mid]:
            l_li = y[0:mid]
            get_num(x,l_li)
        else:
            print('find it! %s'%x)
    get_num(189,list)
    二分查找法--递归函数
    """"
    三元表达式公式:
    值1 if 条件 值2
    #     条件成立 值1
    #     条件不成立 值2
    # """
    # 三元表达式的应用场景:只在有两种选择的情况下使用
    
    choice = input('请输入你的选择y/n:')
    res = '收费!' if choice == 'y' else '不收费'
    print(res)
    三元表达式--示例

    列表生成式

    # 列表生成式练习
    '''
    需求:将列表中的人名按照“_sb”的格式进行修改
    l = ['tank','nick','oscar','sean']
    
    '''
    
    l = ['tank','nick','oscar','sean']
    new_l = []
    # 方法1:for循环
    for i in l:
        new_l.append('%s_sb'%i)
    print(new_l)  # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
    '''
    需求2:将列表['tank_sb', 'nick_sb', 'oscar_nb', 'sean_sb']后缀为‘_nb’的字符串去掉
    '''
    li = ['tank_sb', 'nick_sb', 'oscar_nb', 'sean_sb']
    res = [name for name in li if name.endswith('_sb')]
    '''
    列表生成式:就是for循环,将元素提到for循环前面来了
    首先进行for循环,将取出的元素放到if条件里去做判断,如果条件成立就返回给for循环前面的变量
    否则直接舍弃。。。
    '''
    print(res)

    字典生成式

    '''
    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ']
    需求:将以上两个列表生成字典形式
    '''
    
    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ']
    # 利用关键字enumerate 枚举法
    d = {}
    for i,j in enumerate(l1):
        print(i,j)
        d[j] = l2[i]
    print(d)
    # 字典生成式
    l2 = ['jason','123','DBJ']
    res = {i:j for i,j in enumerate(l2)}
    print(res)  # {0: 'jason', 1: '123', 2: 'DBJ'}
    
    d = {i:j for i,j in enumerate(l2) if j != '123'}  # 字典生成式与三元表达式
    print(d)

    注意:当字典生成器或列表生成器与三元表达式合用的时候,注意不能加else。for循环会与else搞混。

    集合生成器

    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}
    res1 = (i for i in range(10) if i != 4)  # 这样写不是元组生成式 而是生成器表达式
    print(res1)  # <generator object <genexpr> at 0x0082D8D0>
    for i in res1:
         print(i,end=" ")  # 0 1 2 3 5 6 7 8 9        

    三、匿名函数

    '''
    匿名函数:没有名字的函数,临时启用的函数用完就没有了
            多用于内置函数里面
    '''

    示例:求和函数

    #示例:求和函数
    def sum(x,y):
        return x+y
    res = sum(1,2)
    print(res)  # 3
    
    #用匿名函数实现
    res = (lambda x,y:x+y)(1,2)
    print(res)  # 3
    res = lambda x,y:x+y
    print(res) 
    '''
    匿名函数总结:
        左边的相当于函数形参;右边的相当于函数返回值;
        匿名函数一般不单独使用,一般会和内置函数一起。
    
    '''

    四、常用内置函数

    """
    常用内置函数 map zip filter sorted reduce
    """
    # map
    li = [1,2,3,4,5,6]
    
    print(list(map(lambda x:x+5,li)))  # lambda 对li进行for循环,取出元素进行return x+5的操作。
    
    
    str = 'erqw'
    print(list(str))   # ['e', 'r', 'q', 'w'] 由结果可知,list本质就是for循环。
    # zip
    
    li1 = ['jason','tank','sean']
    li2 = [1,2,3]
    li3 = ['绳子','尺子','','饭盒']  # 多出来的饭盒因为没有对应的关系,所以被舍去
    print(list(zip(li1,li2,li3)))  # 基于for循环
    # [('jason', 1, '绳子'), ('tank', 2, '尺子'), ('sean', 3, '笔')]
    # filter
    li = [1,2,3,4,5,6]
    # 去掉li中的6
    print(list(filter(lambda x: x != 4,li)))  # [1, 2, 3, 5, 6]
    # sorted
    # 默认是从小到大排序
    li = ['tank','jason','egon','sean']
    print(sorted(li))  # ['egon', 'jason', 'sean', 'tank']
    
    # 添加参数reverse ,变成从大到小
    print(sorted(li,reverse=True))  # ['tank', 'sean', 'jason', 'egon']
    # reduce
    from functools import reduce
    li = [1,2,3,4,5]
    print(reduce(lambda x,y: x+y ,li,10))  # 10 就相当于初始值 第一个参数
    """
    当初始值不存在的情况下,遵循以下规律:
    第一次取两个值相加,得到的和与下一个元素相加
    """

     

  • 相关阅读:
    java 变量常量作用域
    简述Integer
    简述(非)静态代码块和构造方法的执行顺序
    父类子类在有(无)参构造方法继承的一些规则
    equals和==的区别
    创建和调用自定义类的方法简述
    int变量与double变量混合运算时的常见问题及方法
    int变量运算过程中的常见问题及方法
    初始Java
    Eclipse常用快捷键
  • 原文地址:https://www.cnblogs.com/qinsungui921112/p/11176041.html
Copyright © 2020-2023  润新知