遞迴函式,匿名函式配合內建函式的使用
一:遞迴函式
函式遞迴呼叫(是一種特殊的巢狀呼叫):在呼叫一個函式的過程中,又直接或間接地呼叫了該函式本身
遞迴必須要有兩個明確的階段:
遞推:一層一層遞迴呼叫下去,強調每進入下一層遞迴問題的規模都必須有所減少
回溯:遞迴必須要有一個明確的結束條件,在滿足該條件時結束遞推
開始一層一層回溯
遞迴的精髓在於通過不斷地重複逼近一個最終的結果
例子:用遞迴實現列表二分法查詢元素
有一個從小到大排列的整型數字列表
nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]
def search(search_num,nums):print(nums)
if len(nums) == 0:
print('not exists')
return
mid_index=len(nums) // 2
if search_num > nums[mid_index]:
# in the right
nums=nums[mid_index+1:]
search(search_num,nums)
elif search_num < nums[mid_index]:
# in the left
nums=nums[:mid_index]
search(search_num,nums)
else:
print('find it')
search(31,nums)
二:匿名函式
1:# 有名函式:基於函式名重複使用
2:# 匿名函式:沒有繫結名字的下場是用一次就回收了
# f=lambda x,y:x+y
# print(f)
# print(f(1,2))
三:常用內建函式配合lambda函式的使用 #max min map filter sorted
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
# max的工作原理
#1 首先將可迭代物件變成迭代器物件
#2 res=next(可迭代器物件),將res當作引數傳給key指定的函式,然後將該函式的返回值當作判斷依據
# def func(k):
# return salaries[k]
# print(max(salaries,key=func)) #next(iter_s)
#'egon', v1=func('egon')
#'alex', v2=func('alex')
#'wupeiqi', v3=func('wupeiqi')
#'yuanhao', v4=func('yuanhao')
res=max(salaries , key=lambda key:salaties[key])#配合lambda函式使用將薪資最高的人取出來
print(res)
print(min(salaries,key=lambda k:salaries[k])) #next(iter_s) #取出薪資最低的人原理與max一樣
# salaries={
# 'egon':3000,
# 'alex':100000000,
# 'wupeiqi':10000,
# 'yuanhao':2000
# }
# print(sorted(salaries,key=lambda k:salaries[k],reverse=True))#將字典裡的人物按照薪資進行排序,reverse可以控制 排序方式,順序或者倒序。
# map的工作原理
#1 首先將可迭代物件變成迭代器物件
#2 res=next(可迭代器物件),將res當作引數傳給第一個引數指定的函式,然後將該函式的返回值當作map的結果之一
# aaa=map(lambda x:x+"_SB",names)
# print(aaa)
# print(list(aaa))
# filter的工作原理#過濾函式
#1 首先將可迭代物件變成迭代器物件
#2 res=next(可迭代器物件),將res當作引數傳給第一個引數指定的函式,然後filter會判斷函式的返回值的真假,如果為真則留 下res
names=['alexSB','egon','wxxSB','OLDBOYSB']
# print([name for name in names if name.endswith('SB')])#列表推到式取出以SB結尾的名字
aaa=filter(lambda x:x.endswith('SB'),names)#使用過濾函式取出以SB結尾的名字
print(aaa) #迭代器物件
print(list(aaa))
四:其他需要掌握的內建函式:
1,bytes
# res='你好'.encode('utf-8')#將unicode字元轉成位元組型別
# print(res)
# res=bytes('你好',encoding='utf-8')#直接用bytes可以轉換
# print(res)
2,chr 參考ascii表將數字轉成字元,ord將字元轉換成對應的數字
# 參考ASCII表將數字轉成對應的字元
# print(chr(65))
# print(chr(90))
# 參考ASCII表將字元轉成對應的數字
# print(ord('A'))
3,divmod 求商和餘數
# print(divmod(10,3))#列印結果為3餘1
4,enumerate 列舉
# l=['a','b','c']
# for k ,item in enumerate(l):
# print(k,item)
5, eval 把字串中的表示式拿出來執行一下
# l='[1,2,3]'
# l1=eval(l)#將列表形式的字串取出來,拿到一個列表,可以依靠索引取值,多用於從檔案中取出列表,字典之類的 資料型別
# print(l1,type(l1))
# print(l1[0])
6,pow
# print(pow(3,2,2)) #與 (3 ** 2) % 2類似,先平方再求餘
7,round 四捨五入
# print(round(3.3)) #結果為3
#print(round(3.5))#結果為4
8,sum求和函式
# print(sum(range(101))) #1到100的值
9,—import— 用來匯入以字串形式輸入的模組
module=input('請輸入你要匯入的模組名>>: ').strip() #module='asdfsadf'
m=__import__(module)
print(m.time())
五:其他需要了解的內建函式
1, # print(abs(-13)) #求絕對值的方法
2, # print(all([1,2,3,])) #全部為True則為真
3, # print(all([])) #空的可迭代物件為真
4, # print(any([0,None,'',1])) #有一個為True則為True
5, # print(any([0,None,'',0])) #False
6, # print(any([])) #空列表為假
7, # print(bin(3)) #11 #十進位制轉換成二進位制
8, # print(oct(9)) #11 #十進位制轉成八進位制
9, # print(hex(17)) #11 #十進位制轉成十六進位制
10,# print(callable(len)) #函式是否能被呼叫
11, # import time
12, # print(dir(time)) #列舉出所有:time.名字
13, # s=frozenset({1,2,3}) # 不可變集合
14, # s1=set({1,2,3}) # 可變集合
15, # # print(globals()) #檢視全域性變數
16, # # print(locals()) #檢視區域性變數
17, # hash([1,2,3]) #是否可以被hash
18, # def func():
# """
# 文件註釋
# :return:
# """
# pass
# print(help(func)) #help函式檢視一個函式的幫助文件
19, # l=['a','b','c','d','e']
# s=slice(1,4,2) #類似於先定義一個切片方式,以後可以方便連續使用
# print(l[1:4:2])
# print(l[s])
20,# print(vars())#返回物件object的屬性和屬性值的字典物件,如果沒有引數,就列印當前呼叫位置的屬性和屬性值 類似 locals()。