內建函式⼆
本節主要內容:
1. lamda匿名函式
2. sorted()
3. filter()
4. map()
5. 遞迴函式
一. lamda匿名函式
為了解決一些簡單的需求而設計的一句話函式
計算n的n次方
原本寫法:
def func(n):
return n**n
print(func(10))
read('../oldboy/', 0)
六. 二分查詢
二分查詢. 每次能夠排除掉⼀半的資料. 查詢的效率非常⾼高. 但是侷限性比較⼤大. 必須是有 序列才可以使⽤二分查詢
要求: 查詢的序列列必須是有序序列列.
lamda匿名函式的寫法:
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: 是否是倒敘. True: 倒敘, False: 正序
# 根據字串長度進行排序 lst = ["麻花藤", "岡本次郎", "中央情報局", "狐仙"] # 計算字串串長度 def func(s): return len(s) print(sorted(lst, key=lambda s: len(s)))
三. filter()
篩選函式
語法: filter(function. Iterable)
function: ⽤用來篩選的函式. 在filter中會⾃自動的把iterable中的元素傳遞給function.
然後 根據function返回的True或者False來判斷是否保留留此項資料
Iterable: 可迭代物件
lst = [{"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}] fl = filter(lambda e: e['age'] > 16, lst) # 篩選年年齡⼤大於16的資料 print(list(fl))
四. map()
對映函式
語法: map(function, iterable) 可以對可迭代物件中的每⼀個元素進行對映. 分別取執行 function
計算列表中每個元素的平方 ,返回新列表
def func(e):
return e*e
mp = map(func, [1, 2, 3, 4, 5])
print(mp)
print(list(mp))
改寫成lambda:print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))
計算兩個列表中相同位置的資料的和
lst1 = [1, 2, 3, 4, 5]
lst2 = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x+y, lst1, lst2)))
五. 遞迴
在函式中呼叫函式本身. 就是遞迴
def func():
print("我是誰")
func()
func()
在python中遞迴的深度最⼤到998
遞迴的應用:
我們可以使用遞迴來遍歷各種樹形結構, 比如我們的資料夾系統. 可以使用遞迴來遍歷該 資料夾中的所有檔案
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('../oldboy/', 0)
六. 二分查詢 二分查詢. 每次能夠排除掉一半的資料. 查詢的效率非常⾼高. 但是侷限性比較⼤大. 必須是有 序列才可以使⽤用⼆分查詢
要求: 查詢的序列列必須是有序列.
# 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("找不到數字")