zoukankan      html  css  js  c++  java
  • 递归函数与生成式

    1.函数递归
    # 函数在调用阶段直接或间接的又调用自身
    # import sys
    # print(sys.getrecursionlimit()) # 不是很精确 默认1000左右递归次数限制 一般为997或998
    # sys.setrecursionlimit(2000) # 指定次数

    # 函数不应该无限制的递归下去

    # 递归
    """
    递归分为两个阶段
    1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降
    直到有一个最终的结束条件
    2.递推:一次次往回推导的过程
    """

    # 第一个人年龄为18其后依次加2 求取第5个人的年龄
    # 递归函数
    # def age(n):
    # if n == 1: # 必须要有结束条件
    # return 18
    # return age(n-1) + 2
    # res = age(5)
    # print(res)


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

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

    2.算法之二分法
    # 算法:解决问题的高效率的方法
    l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
    # num = 345
    # for i in l:
    # if num == i:
    # print('find it')

    # 二分法:容器类型里面的数字必须有大小顺序
    target_num = 666
    def get_num(l,target_num):
    if not l: # 处理不能无限切分列表的bug
    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)
    # elif target_num == l[middle_index]:
    # print('find it',target_num) 此为最后一种情况等同于下面else代码
    # 一般情况下尽量多用elif穷举出所有的情况
    else:
    print('find it',target_num)

    get_num(l,target_num)

    3.三元表达式
    """
    三元表达式固定表达式
    值1 if 条件 else 值2
    条件成立 值1
    条件不成立 值2
    """
    方法一
    def my_max(x,y):
    if x > y:
    return x
    else:
    return y

    方案二
    res = x if x > y else y # 三元 1元为值x 2元为if条件 3元为else条件

    4.列表生成式
    # l = ['tank','nick','oscar','sean']
    # l1 = []
    # for name in l:
    # l1.append('%s_sb'%name)
    # # l1.append(name + '_sb') # 不推荐使用
    # print(l1)

    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)

    5.字典生成式
    # l1 = ['name','password','hobby']
    # l2 = ['jason','123','DBJ','egon']
    #
    # d = {}
    # for i,j in enumerate(l1):# enumerate 枚举
    # d[j] = l2[i]
    # print(d)

    #
    # l1 = ['jason','123','read']
    # d = {i:j for i,j in enumerate(l1) if j != '123'}
    # print(d)


    res = {i for i in range(10) if i != 4}
    print(res)
    res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成器表达式
    # print(res1)
    # for i in res1:
    # print(i)

    6.匿名函数 lambda
    """
    没有名字的函数

    匿名函数的特点
    临时存在用完就没了
    """
    def my_sum(x,y):
    return x + y

    # res = (lambda x,y:x+y)(1,2)
    # print(res)
    # func = lambda x,y:x+y
    # print(func(1,2))

    # :左边的相当于函数的形参
    # :右边的相当于函数的返回值
    # 匿名函数通常不会单独使用,是配合内置函数一起使用

    7.常用内置函数
    # l = [1,2,3,4,5]
    # print(max(l)) # 内部是基于for循环的
    #
    #
    # """
    # A-Z 65 90
    # a-z 97 122 # 二进制转换10进制后对应ascll码
    # """
    # print(chr(97))
    # d = {
    # 'egon':30000,
    # 'jason':88888888888,
    # 'nick':3000,
    # 'tank':1000
    # }
    # def index(name):
    # return d[name]

    # print(max(d,key=lambda name:d[name]))
    # 比较薪资 返回人名
    # print(min(d,key=lambda name:d[name]))


    # map zip filter sorted reduce

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


    # zip 拉链 # 基于for循环
    # l1 = [1,2,]
    # l2 = ['jason','egon','tank']
    # l3 = ['a','b','c']
    # print(list(zip(l1,l2,l3)))

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

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

  • 相关阅读:
    345. Reverse Vowels of a String(交换元音字母)(leetcode)
    633. Sum of Square Numbers(平方和)(leetcode)
    第七届蓝桥杯大赛个人赛省赛(软件类)真题8
    第七届蓝桥杯大赛个人赛省赛(软件类)真题6
    第七届蓝桥杯大赛个人赛省赛(软件类)真题5
    第七届蓝桥杯大赛个人赛省赛(软件类)真题4
    第七届蓝桥杯大赛个人赛省赛(软件类)真题3
    第七届蓝桥杯大赛个人赛省赛(软件类)真题2
    第七届蓝桥杯大赛个人赛省赛(软件类)真题1
    hdu 1087&1160 最长增序列问题
  • 原文地址:https://www.cnblogs.com/night-rain/p/11192360.html
Copyright © 2011-2022 走看看