python學習 day014打卡 內建函式二&遞迴函式
本節主要內容:
1.lambda匿名函式
2.sorted()
3.filter()
4.map()
5.遞迴函式
6.二分法
一.lambda匿名函式
為了解決一些簡單的需求而設計的一句話函式
# 計算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n**n print(f(10))
lambda表示的是匿名函式.不需要用def來宣告,一句話就可以宣告出一個函式
語法:
函式名 = lambda 引數 : 返回值
注意:
1.函式的引數可以有多個.多個引數之間用逗號隔開
2.匿名函式不管多複雜.只能寫一行,且邏輯結束後直接返回資料
3.返回值和正常函式一樣,可以是任意資料型別
匿名函式並不是說一定沒有名字.這裡前面的變數就是一個函式名.說它是匿名的原因是我們通過__name__
檢視的時候是沒有名字的,統一叫lambda.在呼叫的時候沒有什麼特別之處.像正常的函式呼叫即可.
二.sorted()
排序函式
語法:sorted(Iterable,key=None,reverse = False)
Iterable:可迭代物件
key:排序規則(排序函式),在sorted內部會將可迭代物件中的每個元素傳遞給這個函式的引數.根據函式運算的結果進行排序.
reverse:是否倒敘.Ture:倒敘,False:正序
lst = [1, 5, 3, 4, 6] lst2 = sorted(lst) print(lst) # 原列表不會改變 print(lst2) # 返回的新列表是經過排序的 dic = {1: "A", 3: "C", 2: "B"} print(sorted(dic)) # 如果是字典,則返回排序過後的key
和函式組合使用
# 根據字元串長度進行排序 lst = ["麻花藤", "岡本次郎", "中央情報局", "狐仙"] # 計算字元串長度 def func(s):return len(s) print(sorted(lst, key=func))
和lambda組合使用
lst=[{'id':3,'name':'taihei','age':18}, {'id':1,'name':'alex','age':28}, {'id':2,'name':'taibai','age':58}, {'id':4,'name':'henhei','age':38}] # 根據年齡排序 def func(s): return s['age'] print(sorted(lst, key=lambda dic:dic["age"]))
三.filter()
篩選函式
語法: filter(function,Iterable)
function: 用來篩選的函式.在filter中會自動的把iterable中的元素傳遞給function.然後根據function返回的Ture或者False來判斷是否保留此項資料
Iterable:可迭代物件
lst = ["渴望", "年輪", "家有兒女", "蝸居", "49天", "浪漫滿屋"] # 把後面的可迭代物件中的每一個元素交給前面的函式。 根據函式返回的True或者False。 判斷是否保留該元素 f = filter(lambda s: len(s) > 2, lst) print("__iter__" in dir(f)) for el in f: print(el) lst=[{'id':3,'name':'taihei','age':18}, {'id':1,'name':'alex','age':28}, {'id':2,'name':'taibai','age':58}, {'id':4,'name':'henhei','age':38}] # 篩選年齡大於等於38的人 print(list(filter(lambda ren: ren['age']>=38, lst)))
四.map()
對映函式
語法:map(function,Iterable)可以對可迭代物件的每一個元素進行對映.分別取執行function
lst = [2, 3, 4,5, 6, 7, 1] # 計算列表中的每一項的平方 # 對映 # 把可迭代物件中的每一個元素拿出來交給前面的函式執行. 保留最後的執行結果 m = map(lambda x: x*x, lst) for el in m: print(el) # 給出一個列表 lst = ["alex_123", "alex_456", "wusir_123", "wusir_456", "alex_789"] # # 正確的使用者名稱: alex # 密碼:456 # alex_456 print(list(map(lambda s : " yes" if s=="alex_456" else "false" , lst))) print(list(map(lambda s: s.split("_")[0] == 'alex' and s.split("_")[1] == "456",lst)))
五.遞迴
在函式中呼叫函式本身,就是遞迴
def func(): print("我是誰") func() func()
在python中遞迴的深度最大是1000,但是到不了1000,一般是998
def foo(n): print(n) n += 1 foo(n) foo(1)
遞迴的應用:
我們可以使用遞迴來遍歷各種樹形結構,比如我們的資料夾系統.可以使用遞迴來遍歷該資料夾中的所有檔案
import os def read(filepath,n): files = os.listdir(filepath) # 獲取到當前資料夾中的所有檔案 for fi in files: # 遍歷資料夾中的檔案,這裡獲取的只是本層檔名 fi_d = os.path.join(filepath,fi) # 加入資料夾 獲取資料夾+檔案 if os.path.isdir(fi_d): #如果該路徑下的檔案是資料夾 print("\t"*n,fi) read(fi_d,n+1) #繼續進行相同的操作 else: print("\t"*n,fi) #遞迴出口.最終在這裡隱含著return # 遞迴遍歷目錄檔案下的所有檔案 read("d:/python課件及作業",0)
六.二分查詢
二分查詢,每次能夠排除掉一半的資料.查詢的效率非常高.但是侷限性比較大.必須是有序序列才可以使用二分查詢
要求:查詢的序列必須是有序序列.
# 判斷n是否在lst中出現. # 二分查詢---非遞迴演算法 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] n = int(input("請輸入一個數字:")) left = 0 right = len(lst)-1 while left <= right : mid = (left + right) // 2 if n < lst[mid] : right = mid - 1 elif n > lst[mid] : left = mid + 1 else : print("找到了") break else: print("沒找到")
# 普通遞迴版二分法: def binary_search(lst,n,left,right): if left <= right: mid = (left+right)//2 if n < lst[mid]: right = mid - 1 elif n > lst[mid]: left = mid + 1 else: return mid return binary_search(lst,n,left,right) # 這個return必須要加.否則接收到的永遠是None else: return -1 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] n = int(input("請輸入一個數字:")) left = 0 right = len(lst)-1 print(binary_search(lst,n,left,right))
# 另類二分法,很難計算位置. def binary_search(lst,n): left = 0 right = len(lst) - 1 if left > right: print("不在這裡") return False mid = (left+right) // 2 if n < lst[mid]: return binary_search(lst[:mid],n) elif n > lst[mid]: return binary_search(lst[mid+1:], n) else: print("在這裡") return True lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] n = int(input("請輸入一個數字:")) print(binary_search(lst,n))