一、二分法
二分法:就是高效解决问题的办法 需求:有一个按照从小到大顺序排列的数字列表,需要从该数字列表中找到我们想要的某一个数字 如何快速找到呢?
有需求:nums=[-1,5,3,8,11,80,100] ,我想要快速找到100.
没学二分法之前:
nums=[-1,5,3,8,11,80,100] find_num=100 #需要找的值 nums.sort() #这里排序一下先 print(nums) # 方案一:要把所有值都取出来才能找到,效率太低,而且占内存 for num in nums: if num == find_num: print('find it') break
当我们学完二分法公式:
二分法如下公式: # def f(find_num,列表): # res=找列表中间的值 # if find_num > res: # # 接下来的查找应该是在列表的右半部分 # 列表=列表切片右半部分 # f(find_num,列表) # elif find_num < res: # # 接下来的查找应该是在列表的左半部分 # 列表=列表切片左半部分 # f(find_num,列表) # else: # print('find it')
套用这个公式和思路,把上面的需求拿过来:
nums=[-1,5,3,8,11,80,100] find_num=100 def f(find_num,l): print(l) if len(l) == 0: print('找的值不存在') return res=len(l) // 2 #中间值 if find_num > l[res]: # 接下来的查找应该是在列表的右半部分 l=l[res+1:] #这里+1 是因为切片顾头不顾尾,而res刚刚已经和find_num比较过了 所有这里+1 f(find_num,l) elif find_num < l[res]: # 接下来的查找应该是在列表的左半部分 l=l[:res] f(find_num,l) else: print('find it') f(find_num,nums)
这样如果我们列表及时有上万个,我们不用循环把所有的值遍历出来,也可以快速的找出来我们想到的值,这就是二分法。
二、匿名函数
匿名函数:就是没有名字的函数,只用于临时使用一次的场景
其最简单的公式如下
普通函数想要得到1+2=3是这样的 def func(x,y): return x+y print(func(1,2)) + 而我们匿名函数lambda是这样的(他并没有去定义一个变量名) print((lambda x,y:x+y)(1,2)) #一行代码,简单粗暴,用完就扔
匿名函数应用:找工资最高,示例:
salaries = { "yeqing1": 3600, "yeqing2": 3000, "yeqing3": 4000 } # 取工资最高的那个人的名字 # max的应用 找最高 def func(k): return salaries[k] res=max(salaries,key=func) print(res) res=max(salaries,key=lambda k:salaries[k]) print(res) # min的应用 找最低 res=min(salaries,key=lambda k:salaries[k]) print(res) # sorted排序 将工资从低到高排序 res=sorted(salaries,key=lambda k:salaries[k],reverse=True) print(res)