补充知识

递归函数

定义:在函数运行中,直接或间接调用了自身的函数。

( 官网表示:默认的最大递归数为1000,可使用sys.getrecursionlimit查看 )

ps: 如果想修改递归数可使用sys.setrecursionlimit(修改的次数) 进行修改

 注:需要先使用 import sys 安装sys后才可操作。 

 

 递归: 

    1.递推

      一层一层往下推导(每次递推后复杂程度相较于上次会有所下降)

    2.回溯

      依据最后得结论推导出最初需要的答案

      (递归一定要有结束条件)

 

# 伪代码:可能无法运行,但可表达逻辑
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18   0
# 由(1)的岁数推出(5)的岁数
def get_name(n):
    if n == 1:
        return 18
    return get_name(n - 1) + 2
print(get_name(5))

 

算法之二分法

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

二分法:入门最简单的级别

使用条件:数据必须是有序的

(一般将数据一分为二后,从最后一个开始对比,不成功再将二分之一的数据再次分为二等分再比较直至找出)

l = [23, 56, 76, 87, 98, 123, 445, 657, 887, 954, 988]
# 找出445
# plan 1 :使用for循环
for i in l:
    if i == 445:
        print('找到了')
    else:
        continue
# plan2: 使用二分法
def my_plan(target_num, l):
    if len(l) == 0:   # 找不到后则退出
        print('抱歉,没有该数据')
        return
    middle_index = len(l) // 2  # 先获取中间位置的索引值
    # 判断是大是小  
    if target_num > l[middle_index]:  # 说明寻找的元素可能在右侧
        l_right = l[middle_index + 1:]
        print(l_right)
        my_plan(target_num, l_right)
    elif target_num < l[middle_index]:  # 说明寻找的元素可能在左侧
        l_left = l[:middle_index]
        print(l_left)
        my_plan(target_num, l_left)
    else:
        print('找到了', target_num)

my_plan(445, l)  # 在()内输入想寻找的数据即可


# 如果要查找的数据在开头,二分法则没有for循环效率快

 三元表达式

当功能需求仅仅是二选一的情况下  推荐使用三元表达式

# 传统 比大小
def my_max(a, b):
    if a > b:
        return a
    else:
        return b
# 三元表达 比大小
def my_max(a, b):
    return a if a > b else b
my_max(3,4)

 

"""
条件成立采用if前面的值,条件不成立采用else后的值
三元表达式尽量不要嵌套使用
"""
res = '上课' if 10 > 2 else '下课'
print(res)  # 上课 
res = '上课' if 2 > 6 else ('下课' if 6 > 5 else '放假')
print(res)  # 下课


# 小练习:电影是否收费
# 老办法
is_free = input('电影是否收费(y/n):').strip()
if is_free == 'y':
    print('收费')
else:
    print('免费')
# 三元发
print('收费' if is_free == 'y' else '免费')

列表生成式

name_list = ['jason', 'jerry', 'lili', 'tony']
# 在每个名字后加上_max的后缀
# 传统法
# 1.定义一个空列表存放数据
new_list = []
# 2.for 循环老列表
for name in name_list:
    # 3.生成新的名字
    new_name = '%s_max' % name
    # 4.添加至新列表
    new_list.append(new_name)
print(new_list)

"""列表生成式"""
res = ['%s_max' % name for name in name_list]
print(res)

 

 

 

 字典生成式

# 传统法
l1 = ['name', 'age', 'hobby']
l2 = ['jerry', 18, 'shopping']
new_dict = {}
for i in range(len(l1)):  # 取出索引值
    new_dict[l1[i]] = l2[i]
print(new_dict)

# 字典生成式
# 枚举
'''
enumerate(l1)
    针对该方法使用for循环取值 每次会产生两个结果
        第一个是从0开始的数字
        第二个是被循环对象里面的元素
    还可以通过start参数控制起始位置
'''
for i, j in enumerate(l2):
    new_dict[l1[i]]=l2[i]
print(new_dict)


# 将Jason取出
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
print(res)
# 取出对应的索引值
res1 = {i for i,j in enumerate(name_list)}
print(res1)

 

 

 匿名函数

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

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

  匿名函数一般不会单独使用,都是配合其他函数使用

print(lambda x:x**2)
def index():
    pass
print(index)
print((lambda x: x ** 2)(2))
res = lambda x: x ** 2
print(res(2))
# 配合函数使用
# map()  映射
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def index(n):
    return n ** 2
print(list(map(lambda x: x ** 2, l)))

 

 

posted @ 2021-11-18 17:23  代小白菜  阅读(64)  评论(0)    收藏  举报