一:遞歸函數
函數遞歸調用(是一種特殊的嵌套調用):在調用一個函數的過程中,又直接或間接地調用了該函數本身
遞歸必須要有兩個明確的階段:
遞推:一層一層遞歸調用下去,強調每進入下一層遞歸問題的規模都必須有所減少
回溯:遞歸必須要有一個明確的結束條件,在滿足該條件時結束遞推
開始一層一層回溯
遞歸的精髓在於通過不斷地重複逼近一個最終的結果
例子:用遞歸實現列表二分法查找元素
有一個從小到大排列的整型數字列表
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()。