自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
匿名函數是指沒有名字的函數,應用在需要一個函數,但是又不想費神去命名這個函數的場合。通常情況下,這樣的函數只使用一次。在Python中,使用lambda表達式創建匿名函數,其語法格式如下:
result = lambda [arg1 [,arg2,……,argn]]:expression
參數說明:
l??result:用于調用lambda表達式。
l??[arg1 [,arg2,……,argn]]:可選參數,用于指定要傳遞的參數列表,多個參數間使用逗號“,”分隔。
l??expression:必選參數,用于指定一個實現具體功能的表達式。如果有參數,那么在該表達式中將應用這些參數。
注意:使用lambda表達式時,參數可以有多個,用逗號“,”分隔,但是表達式只能有一個,即只能返回一個值。而且也不能出現其他非表達式語句(如for或while)。
例如,要定義一個計算圓面積的函數,常規的代碼如下:
import?math?????????????????????????????#?導入math模塊
def?circlearea(r):?????????????????????#?計算圓面積的函數
????result = math.pi*r*r???????????????#?計算圓面積
????return?result??????????????????????#?返回圓的面積
r = 10??????????????????????????????????#?半徑
print('半徑為',r,'的圓面積為:',circlearea(r))
執行上面的代碼后,將顯示以下內容:
半徑為?10?的圓面積為:?314.1592653589793
使用lambda表達式的代碼如下:
import?math?????????????????????????????????#?導入math模塊
r = 10??????????????????????????????????????#?半徑
result =?lambda?r:math.pi*r*r???????????????#?計算圓的面積的lambda表達式
print('半徑為',r,'的圓面積為:',result(r))
執行上面的代碼后,將顯示以下內容:
半徑為?10?的圓面積為:?314.1592653589793
從上面的示例中可以看出,雖然使用lambda表達式比使用自定義函數的代碼減少了一些,但是在使用lambda表達式時,需要定義一個變量,用于調用該lambda表達式,否則將輸出類似的結果:
<function <lambda> at 0x0000000002FDD510>
這看似有點畫蛇添足。那么lambda表達式具體應該怎么應用?實際上,lambda的首要用途是指定短小的回調函數。下面通過一個具體的實例進行演示。
場景模擬:假設采用爬蟲技術獲取某商城的秒殺商品信息,并保存在列表中,現需要對這些信息進行排序,排序規則是優先按秒殺金額升序排列,有重復的,再按折扣比例降序排列。
??實例06??應用lambda實現對爬取到的秒殺商品信息進行排序
在IDLE中創建一個名稱為seckillsort.py的文件,然后在該文件中定義一個保存商品信息的列表,并輸出,接下來再使用列表對象的sort()方法對列表進行排序,并且在調用sort()方法時,通過lambda表達式指定排序規則,最后輸出排序后的列表,代碼如下:
bookinfo = [('不一樣的卡梅拉(全套)',22.50,120),('零基礎學Android',65.10,89.80),
??????? ('擺渡人',23.40,36.00),('福爾摩斯探案全集8冊',22.50,128)]
print('爬取到的商品信息:\n',bookinfo,'\n')
bookinfo.sort(key=lambda?x:(x[1],x[1]/x[2]))????#?按指定規則進行排序
print('排序后的商品信息:\n',bookinfo)
在上面的代碼中,元組的第一個元素代表商品名稱,第二個元素代表秒殺價格,第三個元素代表原價。例如,“( '不一樣的卡梅拉(全套) ',22.50,120)”表示商品名稱為“不一樣的卡梅拉(全套)”,秒殺價格為“22.50”元,原價為“120”元。
運行結果如圖16所示。
圖16??對爬取到的秒殺商品信息進行排序