• 函数的补充


    一、函数的递归

    函数在调用阶段直接或间接的又调用自身

    递归分为两分阶段

    1.回溯:

    相当于一次次重复的过程,这个重复的过程由复杂化逐渐变为简单化,直到有一个最终的结束条件

    2.速推:

    一次次往回推倒的过程

    例题1

     age(5) = age(4) + 2
     age(4) = age(3) + 2
     age(3) = age(2) + 2
     age(2) = age(1) + 1
     age(1) = 20
    
    根据题目推到出如下规律:
    
    
     age(n) = age(n-1) + 2
     age(1) = 18
    
    根据此规律使用递归函数
    
     def age(n):
         if n == 1:  # 结束条件
             return 20
         return age(n-1) + 2
     age(5)
     res = age(5)
     print(age(5))  # 打印结果:28
    View Code

    例题2

    l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
    此列表可以利用for循环来进行取值,
    但是在l列表中可以看出,这是列表套列表,
    列表内是整型和列表两个值
    如果需要将里面的值取出,需要进行多次操作,
    这样就会很麻烦。
    
    
    for i in l:
        if type(i) == int:
            print(i)
        else:
            for type(item) in i:
                print(item)
            else:
                for type(j) in item:
                    print(j)
                    ......
    
    
    
    所以可以利用递归函数来取值,这样就会很方便。
    
    def get_num(l):  # 定义函数里的形参为l
        for i in l:  # 利用for循环取列表l中的数值
            if type(i) is int:  # 如果取出来的值为整型
                print(i)  # 打印整型这个值
            else:
                get_num(i)
    get_num(l)  # 结果将l列表中的整型数值全部取出来
    
    递归函数不需要考虑循环的次数,只需要把握结束条件
    View Code

    补充

    如果想让一个函数正常执行,可以在代码中输入pass或者...(英文),推荐使用pass
     def index():
         pass
         ...
     index()

    二、算法之二分法

    算法是什么?

    算法是解决问题的高效方法

     二分法:

    容器类型里面的数字必须有大小顺序

    l = [1,2,3,4,5,6,7,8,9,45,78,89,99]
    
    1.利用for循环
    
    num = 89
    for i in l:
        if i == num:
            print('find it')
    
    首先,需要找到列表l中89这个值,
    那么可以利用for循环来找,但是for循环会在这个列表中一个个值拿出来比较,
    这样的话,对于python解释器来讲就会很繁琐,
    同样,也会有方便的方法来进行取值
    
    
    
    
    2.利用函数递归
    
    target_num = 89
    def get_num(l,target_num):  # 传入列表l和所需要找的值
        middle_index = len(l) // 2  # 获取列表中间的索引
        if target_num > l[middle_index]:  # 判断target_num这个值是否大于l[middle_index]:索引的的值,如果大于,则切取列表右半部分
            num_right = l[middle_index + 1:]  # 因为切分顾头不顾尾,所以中间那个值不要,将它的索引加一就是右边的数字了
            get_num(num_right,target_num)  # 递归调用get_num函数
        elif target_num <l[middle_index]:  # 判断target_num的数字是否小于l[middle_index]边的数字,如果大于,则切取列表右半部分
            num_left = l[0:middle_index]  # 顾头不够尾,以索引0开头,中间那个值不要,切分左半部分
            get_num(num_left,target_num)  # 递归调用get_num函数
        else:
            print('find it',target_num)  # # 打印结果
    get_num(l,target_num)   # 调用函数
    View Code

    三、三元表达式

    def my_max(x,y):
        if x > y:
            return x
        else:
            return y
    
    这是使用函数来比较两个数的大小,但是利用函数表达式,一行代码就能够表达出来
    x = 30
    y = 10
    res = x if x > y else y  # 如果if后面的条件成立返回if前面的值 否则返回else后面的值
    
    print(res)  # 打印结果30
    三元表达式例子

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

    注意

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

    is_free = input('请输入是否免费(y/n)>>>:')
     is_free = '免费' if is_free == 'y' else '收费'
     print(is_free)

    四、列表生成式

    1.常用的方法
    
    l = ['tank','nick','oscar','sean']
    l1 = []  # 新建一个列表
    for name in l:  # 利用for循环取l列表中的值
        l1.append('%s_sb'%name)  # 将所需要的符号添加到名字后面,追加到l1列表中
    
    print(l1)  # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
    
    2.利用列表生成式
    l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
     res = ['%s_DSB'%name for name in l]
     print(res)  # ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB']
    View Code

    五、字典生成式

    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ','egon']
    
    d = {}  # 创建新字典
    for i,j in enumerate(l1):
        d[j] = l2[i]
    print(d)  #  ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB']
    View Code

    六、匿名函数

    没有名字的函数

    特点:临时存在用完就没了

    def my_sum(x,y):
        return x + y
    my_sum( )  # 在此调用即可
    
    
    res = (lambda x,y:x+y)(1,2)
    print(res)  # 3
    :左边的相当于函数的形参
    :右边的相当于函数的返回值
    匿名函数通常不会单独使用,是配合内置函数一起使用
    View Code

    七、内置函数

    map 映射
    l = [1,2,3,4,5,6]
    print(list(map(lambda x:x+1,l)))  # 基于for循环,列表里的每个值都加一,然后再用列表括起来,就可以得到需要的结果
    
    
    zip 拉链  # 基于for循环
    l1 = [1,2,]
    l2 = ['jason','egon','tank']
    l3 = ['a','b','c']
    print(list(zip(l1,l2,l3)))   # [(1, 'jason', 'a'), (2, 'egon', 'b')]
    
    # 可以将列表1,2,3的值在列表里以元组的形式存在,它的打印结果是一一对应的,多一个少一个都不会报错
    
    
    filter 筛选
    l = [1,2,3,4,5,6]
    print(list(filter(lambda x:x!=2,l)))  # 利用filter来进行筛选,匿名函数lanbda来进行判断,可以看出不等于2,所以不需要2这个值,打印结果为[1,3,4,5,6]
    
    
    
    sorted  排序
    l = [1,5,9,3,4,6,7]
    print(sorted(l))  # [1, 3, 4, 5, 6, 7, 9]  默认是从小到大进行排序
    
    
    reduce 需要在模块里面导  打印结果只会是一个值
    from functools import reduce
    l = [1,2,3,4,5]
    当没有初始值
    print(reduce(lambda x,y:x+y,l))  # 会将列表中所有值相加,打印结果为15
    
    
    当有初始值
    print(reduce(lambda x,y:x+y,l,5))
    #首先l列表中第一个值会与5这个初始值相加,然后依次与后面的数值相加
    View Code
  • 相关阅读:
    poj 2754 Similarity of necklaces 2 转换成多重背包,单调队列优化/ 二进制优化
    new和delete2
    new和delete1
    new和delete4
    new和delete3
    new(placement new)
    用例图中的Actor(参与者)一定是人吗?
    二维数组的函数参数传递
    二维指针动态创建二维数组(C/C++)
    OOD的五项基本原则——SOLID
  • 原文地址:https://www.cnblogs.com/xiongying4/p/11179110.html
Copyright © 2020-2023  润新知