遞歸函數及匿名函數配合內置函數的使用

一:遞歸函數

函數遞歸調用(是一種特殊的嵌套調用):在調用一個函數的過程中,又直接或間接地調用了該函數本身

遞歸必須要有兩個明確的階段:

遞推:一層一層遞歸調用下去,強調每進入下一層遞歸問題的規模都必須有所減少

回溯:遞歸必須要有一個明確的結束條件,在滿足該條件時結束遞推

開始一層一層回溯

遞歸的精髓在於通過不斷地重複逼近一個最終的結果

例子:用遞歸實現列表二分法查找元素

有一個從小到大排列的整型數字列表

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()。