匿名(lambda)函式:
作用:創始一個匿名函式物件,同 def 類似,但不提供函式名,只是一個運算式,lambda比函式簡單且可以隨時創建和銷毀,有利于減少程式的偶合度,lambda的主體是一個運算式,而不是一個代碼塊,僅僅能在lambda運算式中封裝有限的邏輯進去,lambda 函式擁有自己的命名空間,且不能訪問自己引數串列之外或全域命名空間里的引數,
語法格式:lambda [函式形參串列]: 運算式
lambda [arg1 [,arg2,.....argn]]:expression
【注意】:
1) . lambda 運算式創建的函式只能包含一條運算式;
2) . 由于lambda函式回傳的是函式物件(構建的是一個函式物件),所以需要定義一個變數去接收,即匿名函式同樣需要被呼叫才能執行,呼叫仍然使用()傳參的方式實作;
3) . 匿名函式同樣可以定義有回傳值沒有回傳值,有引數沒有引數的情況,
代碼演示演示匿名函式的定義和使用(與有名函式對比):
1 # 定義無參有回傳值的有名函式: 2 def func(): 3 return True 4 # 呼叫有名函式執行 5 print(func()) # True 6 7 # 定義無參有回傳值的匿名函式: 8 f = lambda : False 9 # 呼叫匿名函式執行 10 print(f()) # False 11 12 # 定義無參無回傳值的有名函式: 13 def func(): 14 print(True) 15 # 呼叫有名函式執行 16 func() # True 17 18 # 定義無參無回傳值的匿名函式: 19 f = lambda : print(False) 20 # 呼叫匿名函式執行 21 f() # False
分類匿名函式 --> 以引數進行:
1). 1個引數
2). 多個引數
3). 默認引數
4). 可變引數
1 # 先定義有名函式 2 def m1(a): 3 return a ** 2 4 5 def m2(a,b): 6 return a + b 7 8 def m3(s1,s2='hello'): 9 return s1 + s2 10 11 print(m1(3)) # 9 12 print(m2(10,20)) # 30 13 print(m3('北京')) # 北京hello 14
1 # 定義匿名函式的形式以及呼叫 3 print((lambda x: x ** 2)(3)) # 相當于f=lambda x:x**2 ---》Print(f(3)) 4 print((lambda x,y: x + y)(10,20)) # f=lambda x,y:x+y ---》print(f(10,20)) 5 print((lambda s1,s2='hello,': s2 + s1)('老郭')) 6 7 # 匿名函式的可變參格式 8 print((lambda *x: x)('UI','H5','JS','PHP','軟體測驗','網路營銷')) #得到('UI', 'H5', 'JS', 'PHP', '軟體測驗', '網路營銷') 9 print((lambda **y: y)(name='zs',age=18)) #得到{'name': 'zs', 'age': 18}
代碼演示示例:
1 # 需求1:將字串資料'this is \na \ttest' -->得到 'this is a test' 2 3 # 不使用匿名函式 4 str1 = 'this is \na \ttest' 5 lt = str1.split() 6 str2 = ' '.join(lt) 7 print(str2,type(str2)) # 得到this is a test <class 'str'> 8 9 # 使用匿名函式 10 f = lambda x:' '.join(x.split()) 11 print(f(str1)) 12 # 匿名函式精簡版 13 print((lambda x: ' '.join(x.split()))(str1)) 14 15 16 # 需求2:使用匿名函式實作得到兩個數中的較大值 17 my_max = lambda x,y: x if x > y else y 18 # 呼叫匿名函式執行 19 print(my_max(10,20)) # 得到20 20 21 22 # 需求3:演示有名函式和匿名函式嵌套使用情況 23 # 示例(1) 24 def test(a,b,func): 25 result = func(a,b) 26 return result 27 # 呼叫函式 28 num = test(11,22,lambda x,y:x+y) 29 print(num) 30 31 # 示例(2) 32 def speak(content): 33 return (lambda x: x + '你好')(content) 34 print(speak('北京'))
代碼演示匿名函式配合容器型別使用:
1 # 1.匿名函式配合串列物件使用 2 lt = [lambda x:x ** 2,lambda x:x ** 3,lambda x:x ** 4] 3 for i in lt: # 遍歷lt物件 4 print(i(2)) # 得到 4 8 16 5 6 # 單獨獲取某一個元素并且執行 7 print(lt[-1](3)) # 得到81 8 9 # 2.匿名函式配合字典物件使用 10 dic1 = {'A':lambda :2*2,'B':lambda :3*3,'C':lambda :4*4} 11 print(dic1['C']()) # 得到16 12 13 # 3.串列嵌套字典,按照身高進行排序顯示(降序) 14 dic2 = [ 15 {'name':'張學友','age':56,'height':173.0}, 16 {'name':'劉德華','age':55,'height':176.0}, 17 {'name':'郭富城','age':54,'height':170.0}, 18 {'name':'黎明','age':57,'height':181.0}, 19 ] 20 dic2.sort(reverse=True,key=lambda x:x['height']) # 相等于 sorted(reverse=Ture,key=lambda x:x['height']) 21 print(dic2)
【補充】:sorted()和sort()函式的區別
相同點:它們都是來實作排序的操作(功能層面)
不同點:sort 是應用在 list 上的方法,sorted 可以對所有可迭代的物件進行排序操作,串列中的sort函式,它執行完畢后會直接影響原本這個list的內部結構(內部的資料發生改變了);而內置函式sorted函式,它執行完畢后不會影響原本容器中的內部結構,而會回傳一個新的串列給程式,list 的 sort 方法回傳的是對已經存在的串列進行操作,無回傳值,而內建函式 sorted 方法回傳的是一個新的 list,而不是在原來的基礎上進行的操作,
sorted()函式:
語法:sorted(iterable[, cmp[, key[, reverse]]])
引數:
iterable -- 可迭代物件
cmp -- 比較的函式,有兩個引數,引數的值都是從可迭代物件中取出,此函式必須遵守的規則為,大于則回傳1,小于則回傳-1,等于則回傳0
key -- 主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自于可迭代物件中,指定可迭代物件中的一個元素來進行排序
reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)
回傳值:回傳重新排序的串列
代碼演示示例:
1 lt = [42,-9,0,-11,67,92,100,-33] 2 print(lt.sort()) # None 3 print(lt) # [-33, -11, -9, 0, 42, 67, 92, 100], lt變化了 4 lt = [42,-9,0,-11,67,92,100,-33] 5 lt1 = sorted(lt) 6 print(lt1) # [-33, -11, -9, 0, 42, 67, 92, 100], 7 print(lt) # [42, -9, 0, -11, 67, 92, 100, -33], lt沒有變 8 9 # 元祖進行sorted操作 10 tp = (42,-9,0,-11,67,92,100,-33) 11 lt1 = sorted(tp) # 得到的仍然是list物件 12 print(lt1,type(lt1)) # [-33, -11, -9, 0, 42, 67, 92, 100] <class 'list'> 13 print(lt) # (42, -9, 0, -11, 67, 92, 100, -33),tp沒有變 14 15 lt = [42,-9,0,-11,67,92,100,-33] 16 lt1 = sorted(r,reverse=True) #reverse=True表示降序 17 print(lt1,type(lt1)) #[100, 92, 67, 42, 0, -33, -11, -9] <class 'list'> 18 19 #這里的思想和高階函式思想很像,key=abs相當于取每個數的絕對值 20 lt = [42,-9,0,-11,67,92,100,-33] 21 lt2 = sorted(lt,key=abs,reverse=True) 22 print(lt2) #[100, 92, 67, 42, -33, -11, -9, 0] 23 24 lt3 = ['aaaaa','bbb','ccccccc','d'] 25 lt4 = sorted(lt3,key=len,reverse=True) key=len相當于取每個數的長度 26 print(lt4) #['ccccccc', 'aaaaa', 'bbb', 'd']
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187337.html
標籤:Python
上一篇:量化投資學習筆記30——《Python機器學習應用》課程筆記04
下一篇:23.python遞回函式介紹
