python記錄_day14 內建函式二 迭代 二分法
阿新 • • 發佈:2018-11-05
一、匿名函式
形式:
lambda 形參:返回值
lambda表示的是匿名函式. 不需要用def來宣告, 一句話就可以宣告出一個函式。匿名函式不是說一定沒名字,而是他們的名字統一稱為“lambda”,可以用__name__檢視
注意:
1. 函式的引數可以有多個. 多個引數之間用逗號隔開
2. 匿名函式不管多複雜. 只能寫一行, 且邏輯結束後直接返回資料
3. 返回值和正常的函式一樣, 可以是任意資料型別
1 #計算n的n次方 2 f = lambda n : n**n 3 4 print(f(10))
二、sorted
排序函式,形式 sorted(iterable, key=None, reverse = False)
iterrable :要進行排序的可迭代物件
key:相當於排序規則,在sorted內部會將可迭代物件的每一個元素傳遞給這個函式,根據函式的運算結果進行排序
reverse: 升序還是降序,False是升序,True是降序
1 lst = ["將夜","擇天記","鬥破蒼穹","武動乾坤"] 2 3 s = sorted(lst, key= lambda el : len(el), reverse = False) #按電視劇名的長度排序 4 5 print(s)
三、filter
篩選函式,形式 filter(function , iterable )
function:篩選規則,將iterable的每一個元素傳遞給這個函式,根據function返回的True或者False來判斷是否保留此項資料
llst = ["將夜","擇天記","鬥破蒼穹","武動乾坤"] s = filter( lambda el : len(el)>3,lst) #按電視劇名的長度排序 for el in s: print(el) 結果: 鬥破蒼穹 武動乾坤
四、map
對映函式 形式 map(function , iterable)
function:對映規則,分別取iterable中的每一個元素,傳遞給函式執行,得到新的資料
1 #列表中每個元素的平方組成新列表 2 lst = [2,4,6,8,10] 3 num = map(lambda x:x*x,lst) 4 5 for el in num : 6 print(el)
五、遞迴
在函式中呼叫函式本身,就是遞迴(自己呼叫自己)
遞迴的最大深度是1000,但是一般都取不到
遞迴關鍵的是找到遞迴入口和遞迴出口
應用:使用遞迴遍歷資料夾系統(遞迴可以用來遍歷各種樹形結構)
1 def func(path, ceng) 2 lst = os.listdir(path) # 開啟一個資料夾. 獲取到資料夾內的所有內容 3 for el in lst: # 當前資料夾內的所有的檔名(包括資料夾名字) 4 file_real_path = os.path.join(path, el) # 拼接檔案的真實路徑 5 # 判斷這個路徑是檔案還是資料夾 6 if os.path.isdir(file_real_path): 7 # 遞迴的入口 8 print("\t"*ceng, el) 9 func(file_real_path,ceng+1) # 重新執行剛才的操作 10 11 else: # 不是資料夾, 是檔案 12 # 遞迴的出口 13 print("\t"*ceng, el) 14 15 func("D:/PyCharm/workspace/周作業",0) #呼叫函式
六、二分法
二分查詢:每次能夠排除掉一半的資料,查詢的效率非常高。 但是侷限性比較大, 必須是有序序列才可以使用二分查詢。
1 #查詢列表中是否存在n 2 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] 3 4 #普通查詢 5 def func(): 6 n =input(">>") 7 for el in lst: 8 if el == int(n): 9 return True 10 else: 11 return False 12 13 # print(func()) 14 15 #判斷列表中是否存在n 16 #二分查詢---非遞迴 17 n = int(input(">>")) 18 left = 0 #左邊界 19 right = len(lst)-1 #右邊界 20 while left<=right: #左邊界小於等於右邊界進入迴圈 21 mid = (left+right)//2 #取商的整數 22 if n < lst[mid]: #判斷你的數字和中間數大小 23 right = mid-1 #右邊界往左移 24 elif n >lst[mid]: 25 left = mid+1 #左邊界往右移 26 else: 27 print("找到了") 28 break 29 else: # 左邊界大於右邊界退出迴圈 30 print("找不到") 31 #二分查詢---遞迴 32 def digui(n,left,right): 33 if left <= right: 34 mid = (left +right)//2 35 if n < lst[mid]: 36 right = mid -1 37 elif n > lst[mid]: 38 left = mid +1 39 else: 40 print("找到了") 41 return True 42 #digui(n, left, right) 43 return digui(n, left, right) # 不寫return,返回值始終為None 44 else: 45 return -1 46 ret = digui(56,0,len(lst)-1) 47 print(ret) 48 49 #二分查詢 ----遞迴(切列表) 50 def binary_search(lst,n): 51 left = 0 52 right = len(lst)-1 53 if left >right: 54 print("找不到") 55 mid = (left + right)//2 56 if n < lst[mid]: 57 #binary_search(lst[:mid], n) 58 return binary_search(lst[:mid],n) # 不寫return,返回值會始終為None 59 elif n > lst[mid]: 60 #binary_search(lst[mid + 1:], n) 61 return binary_search(lst[mid+1: ],n) 62 else: 63 print("找到了") 64 return True 65 ret = binary_search(lst,56) 66 print(ret)示例