一、二分法
二分法:就是高效解决问题的办法 需求:有一个按照从小到大顺序排列的数字列表,需要从该数字列表中找到我们想要的某一个数字 如何快速找到呢?
有需求: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)