關于Python中的匿名函數(shù)lambda

lambda是Python編程語言中使用頻率較高的一個關鍵字魔种。那么滔金,什么是lambda霉涨?它有哪些用法?

一尘惧、語法

lambda [ arg1 [arg2, arg3, … argN] ] : expression
                      – 《Python核心編程》

從《Python核心編程》書本中包含了以上lambda表達式的表述康栈。也就是說在lambda右側的式子中,冒號左邊的為參數(shù)值喷橙,右邊的為計算表達式啥么。

二、 實例說明

1.單層參數(shù)求和

現(xiàn)在假設需要對兩個數(shù)進行求和運算贰逾。對于正常的邏輯代碼悬荣,不難寫出如下代碼:

def sum(x, y):
    return x + y

而在lambda中,我們可以這樣來寫:

p = lambda x, y: x + y

代碼簡潔了許多

2.嵌套參數(shù)求和

注:下面的一段代碼實際上是存在語法錯誤的疙剑,此代碼的目的純粹只是為了說明問題氯迂。請勿模仿

def sum_outer(x=0):
    def sum_inner(y):
        return x + y

采用lambda改寫后的代碼如下:

def test_lamdba2(x=0):
    return lambda y: x + y

三践叠、特性

lambda函數(shù)有如下特性:

  • lambda函數(shù)是匿名的:所謂匿名函數(shù),通俗地說就是沒有名字的函數(shù)嚼蚀。lambda函數(shù)沒有名字禁灼。
  • lambda函數(shù)有輸入和輸出:輸入是傳入到參數(shù)列表argument_list的值,輸出是根據(jù)表達式expression計算得到的值轿曙。
  • lambda函數(shù)一般功能簡單:單行expression決定了lambda函數(shù)不可能完成復雜的邏輯弄捕,只能完成非常簡單的功能。由于其實現(xiàn)的功能一目了然导帝,甚至不需要專門的名字來說明守谓。

四、用法說明

由于lambda語法是固定的舟扎,其本質上只有一種用法分飞,那就是定義一個lambda函數(shù)。在實際中睹限,根據(jù)這個lambda函數(shù)應用場景的不同譬猫,可以將lambda函數(shù)的用法擴展為以下幾種:
1.將lambda函數(shù)賦值給一個變量,通過這個變量間接調用該lambda函數(shù)羡疗。

例如染服,執(zhí)行語句add=lambda x, y: x+y,定義了加法函數(shù)lambda x, y: x+y叨恨,并將其賦值給變量add柳刮,這樣變量add便成為具有加法功能的函數(shù)。例如痒钝,執(zhí)行add(1,2)秉颗,輸出為3。

2.將lambda函數(shù)賦值給其他函數(shù)送矩,從而將其他函數(shù)用該lambda函數(shù)替換蚕甥。

例如,為了把標準庫time中的函數(shù)sleep的功能屏蔽(Mock)栋荸,我們可以在程序初始化時調用:time.sleep=lambda x:None菇怀。這樣,在后續(xù)代碼中調用time庫的sleep函數(shù)將不會執(zhí)行原有的功能晌块。例如爱沟,執(zhí)行time.sleep(3)時,程序不會休眠3秒鐘匆背,而是什么都不做呼伸。

3.將lambda函數(shù)作為其他函數(shù)的返回值,返回給調用者钝尸。

函數(shù)的返回值也可以是函數(shù)括享。例如return lambda x, y: x+y返回一個加法函數(shù)闽铐。這時,lambda函數(shù)實際上是定義在某個函數(shù)內部的函數(shù)奶浦,稱之為嵌套函數(shù),或者內部函數(shù)踢星。對應的澳叉,將包含嵌套函數(shù)的函數(shù)稱之為外部函數(shù)。內部函數(shù)能夠訪問外部函數(shù)的局部變量沐悦,這個特性是閉包(Closure)編程的基礎成洗,在這里我們不展開。

4.將lambda函數(shù)作為參數(shù)傳遞給其他函數(shù)藏否。

部分Python內置函數(shù)接收函數(shù)作為參數(shù)瓶殃。典型的此類內置函數(shù)有這些。

  • filter函數(shù)副签。此時lambda函數(shù)用于指定過濾列表元素的條件遥椿。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結果是[3]淆储。

  • sorted函數(shù)冠场。此時lambda函數(shù)用于指定對列表中所有元素進行排序的準則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序本砰,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]碴裙。

  • map函數(shù)。此時lambda函數(shù)用于指定對列表中每一個元素的共同操作点额。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1舔株,其結果[2, 3, 4]。

  • reduce函數(shù)还棱。此時lambda函數(shù)用于指定列表中兩兩相鄰元素的結合條件载慈。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字符的形式依次結合起來,其結果是'1, 2, 3, 4, 5, 6, 7, 8, 9'诱贿。

另外娃肿,部分Python庫函數(shù)也接收函數(shù)作為參數(shù),例如gevent的spawn函數(shù)珠十。此時料扰,lambda函數(shù)也能夠作為參數(shù)傳入。

五焙蹭、變量作用域說明

關于變量在Lambda中的作用域從上面的幾幅圖中也可以看出一二來晒杈,主要可以做出以下幾點的總結:

  1. 對局部變量可見
  2. 對全局變量可見
  3. 對當前層傳入的參數(shù)可見
  4. 對上層函數(shù)傳入的參數(shù)可見
  5. 對上層Lambda傳入的參數(shù)可見

六、Lambda評價

優(yōu)點

  1. 在普通代碼里幾行的代碼孔厉,在Lambda中只需要一行就可以解決拯钻。所以代碼比以前更簡潔了
  2. 可以在某一個方法內部定義帖努,這樣可以提高操作的便捷性
    缺點
  3. Lambda是一個匿名函數(shù),因為是匿名粪般,所以可讀性變差了
  4. 有時候有多個Lambda嵌套(就像實例中的第3點一樣)拼余,讓程序變得難以理解
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亩歹,隨后出現(xiàn)的幾起案子匙监,更是在濱河造成了極大的恐慌,老刑警劉巖小作,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亭姥,死亡現(xiàn)場離奇詭異,居然都是意外死亡顾稀,警方通過查閱死者的電腦和手機达罗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來静秆,“玉大人粮揉,你說我怎么就攤上這事」钭冢” “怎么了滔蝉?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塔沃。 經(jīng)常有香客問我蝠引,道長,這世上最難降的妖魔是什么蛀柴? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任螃概,我火速辦了婚禮,結果婚禮上鸽疾,老公的妹妹穿的比我還像新娘吊洼。我一直安慰自己,他們只是感情好制肮,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布冒窍。 她就那樣靜靜地躺著,像睡著了一般豺鼻。 火紅的嫁衣襯著肌膚如雪综液。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天儒飒,我揣著相機與錄音谬莹,去河邊找鬼。 笑死,一個胖子當著我的面吹牛附帽,可吹牛的內容都是我干的埠戳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蕉扮,長吁一口氣:“原來是場噩夢啊……” “哼整胃!你這毒婦竟也來了?” 一聲冷哼從身側響起喳钟,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爪模,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荚藻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡洁段,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年应狱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祠丝。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡疾呻,死狀恐怖,靈堂內的尸體忽然破棺而出写半,到底是詐尸還是另有隱情岸蜗,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布叠蝇,位于F島的核電站璃岳,受9級特大地震影響,放射性物質發(fā)生泄漏悔捶。R本人自食惡果不足惜铃慷,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜕该。 院中可真熱鬧犁柜,春花似錦、人聲如沸堂淡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绢淀。三九已至萤悴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間更啄,已是汗流浹背稚疹。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人内狗。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓怪嫌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柳沙。 傳聞我的和親對象是個殘疾皇子岩灭,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容

  • 〇、前言 本文共108張圖赂鲤,流量黨請慎重噪径! 歷時1個半月,我把自己學習Python基礎知識的框架詳細梳理了一遍数初。 ...
    Raxxie閱讀 18,966評論 17 410
  • 一找爱、快捷鍵 ctr+b 執(zhí)行ctr+/ 單行注釋ctr+c ...
    o_8319閱讀 5,826評論 2 16
  • 我是一名普通青年,愛玩游戲泡孩、看電影车摄、吹牛等一切對工作學習沒有任何用處的事情,怎么開心怎么玩仑鸥,雖然有時也會考慮自...
    兩閱鵬閱讀 197評論 0 0
  • 在開始這篇文章之前吮播,先說幾個概念性的東西。CPU 和GPU關于繪圖和動畫有兩種處理方式CPU(中央處理器)和GPU...
    ZhengYaWei閱讀 2,899評論 0 26
  • 第四章 天際漸泛白眼俊,光感直接穿破了我透薄的眼皮意狠,眼球在皮下緩緩轉動起來。 眼皮掙扎著掀開一厘米的寬度疮胖,朦朧...
    子恕閱讀 273評論 1 3