递归函数 | 算法(二分法) | 三元表达式

内容概要

  • 递归函数
  • 算法(二分法)
  • 三元表达式
  • 列表生成式
  • 字典生成式
  • 匿名函数

递归函数

  • 递归
    函数在运行过成中,直接或间接调用自身

  • 官方表示:python默认的最大递归深度为1000次

  • 修改递归次数
    import sys
    print(sys.getrecursionlimit())
    print(sys.setrecursionlimit(2000))

    c = 1
    def index():
    global c
    print(c)
    c += 1
    print('sss index')
    index()

    index()
    image

  • 递推
    一层层往下推导答案(每次递归之后复制度相较于上一次一定要有所下降)

  • 回溯
    依据最后的结论往后推导出最初需要的答案
    递归一定要有结束条件

  • 练习推导年龄
    def age(a):
    if a == 1:
    return 18
    return age(a - 1) + 2

    print(age(5))
    image

  • 练习打印出列表中的所有数字
    l1 = [1, [2, [3, [4, [5, [6, [7, [8, [9]]]]]]]]]

    def s(l1):
    for i in l1:
    if type(i) is int:
    print(i)
    else:
    s(i)

    s(l1)
    image

算法之二分法

  • lis = [11, 22, 33, 66, 99, 123, 234, 456, 678]

    def index(s, lis):
    if len(lis) == 0: # 列表里没有这个数
    print('不好意思没找到')
    return
    a = len(lis) // 2 # 找到中间的索引值
    if s > lis[a]: # 判断中间索引值比目标值大还是小
    lis_right = lis[a + 1:] # 如果目标值大说明要找的值在右侧
    print(lis_right)
    index(s, lis_right)
    elif s < lis[a]:
    lis_left = lis[:a] # 如果目标值小说明要找的值在左侧
    print(lis_left)
    index(s, lis_left)
    else:
    print('找到了', s)
    index(456, lis)
    image

三元表达式

  • def index(a, b):
    if a > b:
    return a
    return b

    print(index(2, 4))
    image

  • 如果功能需求只是二选一的情况下,推荐使用三元表达式

  • def index(a, b):
    return a if a > b else b

    print(index(5, 3))
    image

  • 条件成立采用if前面的值,条件不成立采用else后面的值
    三元表达式尽量不要嵌套使用

  • username = input('user: ').strip()
    print('帅' if username == 'aaa' else '丑')
    image

列表生成式

  • 传统方法给列表里的名字加后缀
    l1 = ['sss', 'aaa', 'ccc']
    l2 = []
    for name in l1:
    new_name = '%s_hhh' % name
    l2.append(new_name)
    print(l2)
    image

  • 列表生成式
    l1 = ['sss', 'aaa', 'ccc']
    print(list('%s_hhh' % name for name in l1))
    image

字典生成式

  • l1 = ['name', 'age', 'hobby']
    l2 = ['sss', 18, 'music']
    dic = {} # 定义一个空字典
    for i in range(len(l1)): # for循环三列表l1,l1的长度是3
    dic[l1[i]] = l2[i] # 字典索引等于l2的索引,字典没有键值对,所以新增键值对
    print(dic) # 打印字典

    c = 0
    for i in l1:
    print(c, i)
    c += 1
    image

  • 枚举
    enumerate(l1)
    针对该方法使用for循环取值,每次会产生两个结果
    第一个是从0开始的数字
    第二个是被循环对象里的元素
    还可以通过start参数控制起始位置

  • l1 = ['name', 'age', 'hobby']
    l2 = ['sss', 18, 'music']
    res = {k: l2[i] for i, k in enumerate(l1)}
    print(res)
    image

匿名函数

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

  • 语法格式
    lambda 形参:返回值

  • print((lambda x: x ** 2)(6))
    image

  • 匿名函数一般不会单独使用,都是配合其他函数使用
    map() 映射
    l1 = [2, 3, 4, 5, 6]
    print(list(map(lambda x: x ** 2, l1)))
    image

image

posted @ 2021-11-18 17:29  一览如画  阅读(153)  评论(0)    收藏  举报