递归函数
递归:函数在运行过程中,直接或者间接的调用了自身(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]
浙公网安备 33010602011771号