python二分法编程_python基础18——二分法面向过程匿名函数
二分法
算法:是高效解決問題的辦法
算法之二分法
格式:
def binary_search(ls, num, lower=0, high=None):
if high is None:
high = len(ls) - 1
mid = (lower + high) // 2
if mid == 0 and num != ls[0]:
return "不存在"
if mid == len(ls) - 1 and num != ls[-1]:
return "不存在"
if num == ls[mid]:
return mid, ls[mid]
elif num < ls[mid]:
return binary_search(ls, num, lower, mid)
else:
return binary_search(ls, num, mid + 1, high)
需求:有一個按照從小到大順序排列的數(shù)字列表
需要從該數(shù)字列表中找到我們想要的那個一個數(shù)字
如何做更高效???
nums=[-3,4,7,10,13,21,43,77,89]
find_num=10
nums=[-3,4,13,10,-2,7,89]
nums.sort() #升序
print(nums)
方案一:整體遍歷效率太低
for num in nums:
if num == find_num:
print('find it')
break
方案二:二分法
def binary_search(find_num,列表):
mid_val=找列表中間的值
if find_num > mid_val:
# 接下來的查找應該是在列表的右半部分
# 列表=列表切片右半部分
binary_search(find_num,列表)
elif find_num < mid_val:
# 接下來的查找應該是在列表的左半部分
# 列表=列表切片左半部分
binary_search(find_num,列表)
else:
print('find it')
nums=[-3,4,7,10,13,21,43,77,89]
find_num=8
def binary_search(find_num,l):
print(l)
if len(l) == 0:
print('找的值不存在')
return
mid_index=len(l) // 2
if find_num > l[mid_index]:
# 接下來的查找應該是在列表的右半部分
l=l[mid_index+1:]
binary_search(find_num,l)
elif find_num < l[mid_index]:
# 接下來的查找應該是在列表的左半部分
l=l[:mid_index]
binary_search(find_num,l)
else:
print('find it')
binary_search(find_num,nums)
面向過程稿編程思想
# 編程思想/范式
面向過程的編程思想:
核心是"過程"二字,過程即流程,指的是做事的步驟:先什么、再什么、后干什么
基于該思想編寫程序就好比在設計一條流水線
優(yōu)點:復雜的問題流程化、進而簡單化
缺點:擴展性非常差
面向過程的編程思想應用場景解析:
1、不是所有的軟件都需要頻繁更迭:比如編寫腳本
2、即便是一個軟件需要頻繁更迭,也不并不代表這個軟件所有的組成部分都需要一起更迭
匿名函數(shù)
1、def用于定義有名函數(shù)
func=函數(shù)的內存地址
def func(x,y):
return x+y
print(func)
2、lamdab用于定義匿名函數(shù)
print(lambda x,y:x+y)
3、調用匿名函數(shù)
方式一:
res=(lambda x,y:x+y)(1,2)
print(res)
方式二:
func=lambda x,y:x+y
res=func(1,2)
print(res)
4、匿名用于臨時調用一次的場景:更多的是將匿名與其他函數(shù)配合使用
# 應用
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
需求1:找出薪資最高的那個人=》lili
res=max([3,200,11,300,399])
print(res)
res=max(salaries)
print(res)
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
# 迭代出的內容 比較的值
'siry' 3000
'tom' 7000
'lili' 10000
'jack' 2000
def func(k):
return salaries[k]
========================max的應用
res=max(salaries,key=func) # 返回值=func('siry')
print(res)
res=max(salaries,key=lambda k:salaries[k])
print(res)
========================min的應用
res=min(salaries,key=lambda k:salaries[k])
print(res)
========================sorted排序
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
print(res)
========================map的應用(了解):對array的每個元素做平方處理
l=['alex','lxx','wxx','薛賢妻']
new_l=(name+'_dsb' for name in l)
print(new_l)
res=map(lambda name:name+'_dsb',l)
print(res) # 生成器
========================filter的應用(了解): 對array進行過濾操作
l=['alex_sb','lxx_sb','wxx','薛賢妻']
res=(name for name in l if name.endswith('sb'))
print(res)
res=filter(lambda name:name.endswith('sb'),l)
print(res)
========================reduce的應用(了解):對array進行合并操作,比如求和運算
from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3],10) # 16
print(res)
res=reduce(lambda x,y:x+y,['a','b','c']) # 'a','b'
print(res)
總結
以上是生活随笔為你收集整理的python二分法编程_python基础18——二分法面向过程匿名函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最囧极限挑战43-60关怎么过(汉典最字
- 下一篇: 续航能力强的笔记本有哪些