博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

递归函数

递归:函数在运行过程中,直接或者间接的调用了自身(python默认的最大递归深度为1000次)

  1.递推

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

  2.回溯

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

  递归一定要有结束条件!!!

算法之二分法

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

# 二分法能够使用的场景,数据集必须有序
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]

def my_partner(target_num,l):
    if len(l)==0:
        print('没有该数字')
        return
    # 获取中间位置索引值
    middle_index=len(l)//2 # 8
    # 判断中间索引对应的值比目标值大还是小
    if target_num>l[middle_index]:
        # 说明要找的元素只可能出现在列表的右侧
        l_right=l[middle_index+1:] # l[9:]
        print(l_right)
        my_partner(target_num,l_right)
    elif target_num<l[middle_index]:
        # 说明要找的元素只可能出现在列表的左侧
        l_left=l[:middle_index]
        print(l_left)
        my_partner(target_num,l_left)
    else:
        print('找到了',target_num)

my_partner(321,l)
my_partner(11,l) # 要查找的元素在开头,那么还没有依次查找的效率高

三元表达式

"""
条件成功采用if前面的值 if 条件 else 条件不成立采用else后面的值
"""
is_free=input('电影是否收费(y/n)>>>:').strip()
print('收费' if is_free=='y' else '免费')

列表生成式

name_list = ['jason', 'kevin', 'tony', 'jerry']
'''传统做法'''
new_list=[]
for name in name_list:
    if name=='jason':
        continue
    else:
        new_name='%s_DSB' % name
        new_list.append(new_name)
print(new_list)
'''列表生成式'''
res=['%s_DSB' % name for name in name_list if name !='jason']
print(res)

字典生成式

l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
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(l1,start=1):
    print(i,j)

name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
print(res)

匿名函数

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

"""
语法格式
    lambda 形参:返回值
匿名函数一般不会单独使用,都是配合其他函数一起使用
"""
l=[1,2,3,4,5,6,7,8,9]
print(list(map(lambda x:x**2,l)))
# [1, 4, 9, 16, 25, 36, 49, 64, 81]