python摸爬滾打之day14----內建函式,遞迴函式
1、匿名函式
用一句話實現的簡單函式.
ret = lambda x : x ** 2 即 函式名 = lambda 形參 : 返回值
print(ret(5)) ----> 25
2、sorted() ----> 排序函式
sorted(iterable, key=func,reverse=False)
將可迭代物件的每一個元素傳遞給func, 然後根據func的返回值進行排序, reverse預設為False.
1 lst = [ {'id':1,'namesorted()':'alex','age':28}, 2 {'id':2,'name':'taibai','age':58}, 3 {'id':3,'name':'taihei','age':18}, 4 {'id':4,'name':'henhei','age':38}] 5 ret = sorted(lst,key=lambda x: x["age"]) #按年齡排序 6 print(ret)
3、filter() ----> 篩選函式
filter(func,iterable)
將可迭代物件的每一個元素傳遞給func, 然後根據func的返回值對可迭代物件的元素進行處理, 篩選出返回值為True的元素, filter結果是一個filter物件(可迭代的),
1 lst = [ {'id':1,'name':'alex','age':28}, 2 {'id':2,'name':'taibai','age':58}, 3 {'id':3,'name':'taihei','age':18}, 4 {'id':4,'name':'henhei','age':38}] 5 print(list(filter(lambda x: x["age"] > 20, lst))) # 將年齡超過20歲的篩除 6 7 # [{'id': 1, 'name': 'alex', 'age': 28},filter()8 # {'id': 2, 'name': 'taibai', 'age': 58}, 9 # {'id': 4, 'name': 'henhei', 'age': 38}]
4、map() ----> 對映函式
map(func, iterable)
將可迭代物件的每一個元素傳遞給func, 進行統一操作, 並返回一個新列表. map結果是一個map物件(可迭代的), 用list().
1 lst = [ {'id':1,'name':'alex','age':28}, 2 {'id':2,'name':'taibai','age':58}, 3 {'id':3,'name':'taihei','age':18}, 4 {'id':4,'name':'henhei','age':38}] 5 print(list(map(lambda x: x["age"] - 5,lst))) # 執行結果是一個新列表 6 7 # [23, 53, 13, 33]map()
5、reduce() ----> 累積函式
import functools import reduce
reduce(func, iterable)
將可迭代物件的前後兩個引數傳給func, 進行函式操作, 然後將前後兩個引數運算得到的結果作為第一個引數, 列表的後一個引數作為第二個引數, 繼續往復func的操作, 得到的是一個具體的結果.
1 print(reduce(lambda x,y: x + y,range(1,10),100)) 2 # 100作為起始值 3 4 5 # 145reduce()
6、遞迴
即 自身呼叫自身. 遞迴的最大遞迴深度為1000次, 但是永遠達不到1000.
注意: 函式在函式體內部呼叫自身時, 也會建立一個新的名稱空間, 遞迴次數越多, 則佔據的空間記憶體就越大, 能不用遞迴就不用遞迴. 所以函式體內一定要有return 返回值, 不然拿到的結果為(None).
1 def func(n): 2 if n == 1: 3 return 1 4 return n * func(n - 1) # 用遞迴實現階乘 5 6 print(func(10))遞迴
7、用二分法實現查詢某元素(重中之重)
優點 : 效率會非常高, 每次能夠排除掉一半的資料.
缺點 : 前提是列表為有序列表.
一: 普通,非遞迴,非列表切片
1 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] 2 3 left = 0 4 right = len(lst)-1 5 inp = int(input("輸入數字: ")) 6 while left <= right: 7 mid = (left + right ) // 2 8 if inp > lst[mid]: 9 left = mid + 1 10 elif inp < lst[mid]: 11 right = mid - 1 12 else: 13 print("列表中有此數") 14 break 15 else: 16 print("列表中沒有此數")非遞迴, 非列表切片
二: 遞迴, 非列表切片
1 lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963] 2 def ck(n,l,r,lst): 3 if l > r: 4 return False 5 mid = (l + r) // 2 6 if n > lst[mid]: 7 l = mid+1 8 return ck(n,l,r,lst) 9 elif n < lst[mid]: 10 r = mid-1 11 return ck(n,l,r,lst) 12 else: 13 return True 14 numb = int(input("輸入數字: ")) 15 print(ck(numb,0,len(lst),lst))遞迴, 非列表切片
三: 遞迴, 列表切片
1 def func(lst,n): 2 if not lst: 3 return False 4 left = 0 5 right = len(lst)-1 6 mid = (left + right) // 2 7 if n > lst[mid]: 8 lst = lst[mid + 1:] 9 return func(lst,n) 10 elif n < lst[mid]: 11 lst = lst[ : mid] 12 return func(lst, n) 13 else: 14 return True 15 numb = int(input("輸入數字: ")) 16 print(func(lst,numb))遞迴, 列表切片