(14)匿名函式

2022-08-14 00:54:13 字數 2956 閱讀 6436

什麼是匿名函式

匿名函式: 沒有名字的函式,意味著只能用一次就被**

匿名函式用 lambda 表示

為何用匿名函式:用於臨時使用一次的功能

匿名函式的定義格式

lambda 引數,引數:表示式 #引數規則和有名函式是一樣的

lambda x,y:return x+y#這個位置的return是自帶的,所以寫表示式時候不需要寫

表示式解析:匿名函式 + 引數:表示式,將表示式的值用return返回

ps:匿名函式自動有乙個返回值,自帶return,不能寫return,也不能寫語句,但是只要有返回值的表示式都可以寫

匿名函式的呼叫方式

print(lambda x,y:x+y)(引數1,引數2)

ps:匿名函式都是與其他功能配合去一起用

匿名函式例項

salaries={

'egon':3000,

'alex':100000000,

'wupeiqi':10000,

'yuanhao':2000

例:用倪匿名函式獲取字典中工資最高的人的名字

print(max(salaries,key=lambda k:salaries[k]))  #將匿名函式的返回值傳遞給key方法,告訴max方法對比的依據是什

邏輯原理就是max先遵循迭代器協議,將salaries的key取出來,然後傳給max裡面的key這個引數,在通過key這個引數傳給函式lamdb

函式內的引數k,引數k再將引數傳遞給表示式,最後獲取的值返回給key,max依據key引數做出判斷

例:用匿名函式獲取字典中工資最低的人的名字

print(min(salaries,key=lambda k:salaries[k]))

例:用匿名函式將字典按照工資的小到大排序放入列表(比薪資取人名)

res=sorted(salaries,key=lambda k:salaries[k],reverse=true) #sorted的reverse預設是false,如果是true就是反過來排序

print(res)  

例:用倪匿名函式獲取字典中工資最大的並且取得這個數字

print(max(salaries.values()))

ps:max預設方法遵循迭代器協議,從字典中取出的值是key,迭代器協議是無法更改的

ps:max方法裡面有乙個引數是key,這個key不是指字典的key,只是表示max方法的引數,這個key就是告訴max方法比較依據是什麼,key一定要指向乙個函式的記憶體位址

匿名函式配合冷門方法,需要了解:

map()#就是對映的意思

就是有多個值,每個值按照乙個對映規則,產生乙個新的值

map(func,iter)有兩個引數,第乙個就是對映規則,另乙個就是可迭代物件

例:把乙個列表按照對映規則對映成乙個新的值

names=['alex','oldboy','kevin','hxx']  #名字列表

res=map(lambda item:item+'_sb',names)

print(list(res))

map可以用列表生成式代替(所以這個方法基本不會用到)

print((name+'_sb' for name in names)) #列表生成器表示式

ps:map的底層原理就是乙個for迴圈一樣的原理,將乙個列表變成迭代器物件,然後next乙個值,將值傳給前面的函式做系列運算,然後將函式的返回值當做對映之後的值

ps:python2中直接將值全部對映成乙個新值放入記憶體中,python3中直接就是乙個迭代器(更省空間)

reduce#就是合併的意思

列:從1-100的數相加

from functools import reduce

res=reduce(lambda x,y:x+y,range(1,101))

print(res)

ps:reduce裡面有乙個初始值sequence,如果不指定就會取range裡面的第乙個值作為初始值,先將可迭代物件變成迭代器物件,然後next一次取得乙個值傳遞給前面的函式,然後與初始值相加做運算,得到乙個新值作為初始值,然後又next一次得到值與初始值相加,直到加到最後乙個值

例:合併字串

l=['a','b','c','d']

res=reduce(lambda x,y:x+':'+y,l)

print(res)

ps:邏輯原理同上面的整數相加

print(':'.join(l))

合併字串可以用join方法替代

print(':'.join(l))

filter #過濾

filter有兩個引數,乙個就是過濾規則,另乙個就是可迭代物件

names=['alex_sb','egon','kevin_sb','oldboy_sb']

res=filter(lambda x:x.endswith('sb'),names)

print(list(res))

filter可以用列表表示式替代

print([name for name in names if name.endswith('sb')])

ps:邏輯原理就是filter將names列表變成迭代器,next一次然後取出乙個值,傳遞給前面的lanbda函式,lambda函式取得值後傳入後面的表示式,然後返回結果,依次直到再也取不到值則結束

14 再走Python路 匿名函式

2020.3.4 bug369456 匿名函式的使用 單引數的匿名函式 a lambda a a a print a 5 多引數的匿名函式 b lambda a,b a b print b 5,6 執行結果如下圖所示 匿名函式的應用,計算機的製作 def jisuan str input 請將計算的...

函式 匿名函式

匿名函式 沒有名稱的函式。匿名函式的使用 1 將其賦值給乙個函式 var show function show 2.匿名函式的自我執行 function hi 函式 無參,有參,帶返回值 帶有返回值的函式 var num function a,b 10,9 consloge.log num 例子 v...

LINQ學習系列 1 4 匿名物件

一.匿名物件介紹 上 var result new view code 若想輸出這個新物件的age屬性的內容,可以讓console.writeline深入到該物件的下一層,console.writeline reuslt,1 即可 雖然匿名物件沒有物件名,不過仍然是型別 編譯器將自動為其生成名字。的...