返回函數(shù)

1毛萌、函數(shù)作為返回值

高階函數(shù)除了可以接受函數(shù)作為參數(shù)外坯台,還可以把函數(shù)作為結(jié)果值返回兼都。
如下所示:
def lazy_sum(*args): def sum(): ax = 0 for x in args: ax = x + ax return ax return sum L = [1,3,4,5,6] f = lazy_sum(*L)#這里定義的是可變參數(shù)赢底,故L前必須加* print(f) print(f())
結(jié)果:
<function lazy_sum.<locals>.sum at 0x000001AC82150730> 19 [Finished in 0.1s]
在這個例子中殴蓬,我們在函數(shù)lazy_sum中又定義了函數(shù)sum,并且狂窑,內(nèi)部函數(shù)sum可以引用外部函數(shù)lazy_sum的參數(shù)和局部變量媳板,當(dāng)lazy_sum返回函數(shù)sum時,相關(guān)參數(shù)和變量都保存在返回的函數(shù)中泉哈,這種稱為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力蛉幸。

請?jiān)僮⒁庖稽c(diǎn),當(dāng)我們調(diào)用lazy_sum()時丛晦,每次調(diào)用都會返回一個新的函數(shù)奕纫,即使傳入相同的參數(shù):
f1 = lazy_sum(*L) f2 = lazy_sum(*L) print(f1 == f2)
結(jié)果:
False [Finished in 0.1s]
f1()和f2()的調(diào)用結(jié)果互不影響。

2烫沙、閉包(closure)

注意到返回的函數(shù)在其定義內(nèi)部引用了局部變量args匹层,所以,當(dāng)一個函數(shù)返回了一個函數(shù)后锌蓄,其內(nèi)部的局部變量還被新函數(shù)引用又固,所以仲器,閉包用起來簡單,實(shí)現(xiàn)起來可不容易仰冠。

另一個需要注意的問題是乏冀,返回的函數(shù)并沒有立刻執(zhí)行,而是直到調(diào)用了f()才執(zhí)行洋只。我們來看一個例子:
def count(): fs =[] for i in range(1,4): def f(): return i * i fs.append(f) return fs f1, f2, f3 = count() print(f1(), f2(), f3())
在上面的例子中辆沦,每次循環(huán),都創(chuàng)建了一個新的函數(shù)识虚,然后肢扯,把創(chuàng)建的3個函數(shù)都返回了。
你可能認(rèn)為調(diào)用f1()担锤,f2()和f3()結(jié)果應(yīng)該是1蔚晨,4,9肛循,但實(shí)際結(jié)果是:
9 9 9 [Finished in 0.2s]
全部都是9铭腕!原因就在于返回的函數(shù)引用了變量i,但它并非立刻執(zhí)行多糠。等到3個函數(shù)都返回時累舷,它們所引用的變量i已經(jīng)變成了3,因此最終結(jié)果為9夹孔。

返回閉包時牢記的一點(diǎn)就是:返回函數(shù)不要引用任何循環(huán)變量被盈,或者后續(xù)會發(fā)生變化的變量。

如果一定要引用循環(huán)變量怎么辦搭伤?方法是再創(chuàng)建一個函數(shù)只怎,用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無論該循環(huán)變量后續(xù)如何更改怜俐,已綁定到函數(shù)參數(shù)的值不變:
def count1(): def f(j): def g(): return j*j return g fs = [] for i in range(1,4): fs.append(f(i))#f(i)立刻被執(zhí)行身堡,因此i的當(dāng)前值被傳入f() return fs f1,f2,f3=count1() print(f1(), f2(),f3())
結(jié)果:
1 4 9 [Finished in 0.1s]
缺點(diǎn)是代碼較長,可利用lambda函數(shù)縮短代碼佑菩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市裁赠,隨后出現(xiàn)的幾起案子殿漠,更是在濱河造成了極大的恐慌,老刑警劉巖佩捞,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绞幌,死亡現(xiàn)場離奇詭異,居然都是意外死亡一忱,警方通過查閱死者的電腦和手機(jī)莲蜘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門谭确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人票渠,你說我怎么就攤上這事逐哈。” “怎么了问顷?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵昂秃,是天一觀的道長。 經(jīng)常有香客問我杜窄,道長肠骆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任塞耕,我火速辦了婚禮蚀腿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扫外。我一直安慰自己莉钙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布畏浆。 她就那樣靜靜地躺著胆胰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刻获。 梳的紋絲不亂的頭發(fā)上蜀涨,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音蝎毡,去河邊找鬼厚柳。 笑死,一個胖子當(dāng)著我的面吹牛沐兵,可吹牛的內(nèi)容都是我干的别垮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼扎谎,長吁一口氣:“原來是場噩夢啊……” “哼碳想!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毁靶,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤胧奔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后预吆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龙填,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩遗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扇商。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖宿礁,靈堂內(nèi)的尸體忽然破棺而出案铺,到底是詐尸還是另有隱情,我是刑警寧澤窘拯,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布红且,位于F島的核電站,受9級特大地震影響涤姊,放射性物質(zhì)發(fā)生泄漏暇番。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一思喊、第九天 我趴在偏房一處隱蔽的房頂上張望壁酬。 院中可真熱鬧,春花似錦恨课、人聲如沸舆乔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽希俩。三九已至,卻和暖如春纲辽,著一層夾襖步出監(jiān)牢的瞬間颜武,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工拖吼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳞上,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓吊档,卻偏偏與公主長得像篙议,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怠硼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)作為返回值 高階函數(shù)除了可以接受函數(shù)作為參數(shù)外鬼贱,還可以把函數(shù)作為結(jié)果值返回。 我們來實(shí)現(xiàn)一個可變參數(shù)的求和香璃。通...
    喵在野閱讀 282評論 0 1
  • 1)函數(shù)作為返回值这难,調(diào)用函數(shù)f時,才真正計(jì)算求和的結(jié)果:f() 2)請?jiān)僮⒁庖稽c(diǎn)增显,當(dāng)我們調(diào)用lazy_sum()時...
    木凜閱讀 272評論 4 1
  • 1 返回函數(shù) 高階函數(shù)除了可以接受函數(shù)作為參數(shù)外雁佳,還可以把函數(shù)作為結(jié)果值返回。我們來實(shí)現(xiàn)一個可變參數(shù)的求和同云。通常情...
    時間之友閱讀 201評論 0 0
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,622評論 0 7
  • 堅(jiān)持許久的讀書會糖权,終究被各種培訓(xùn)和作業(yè)所擠壓,看到上次菲爸的生物課講解炸站,簡單記錄一下星澳。 準(zhǔn)備工作,顯微鏡旱易,血片禁偎,筆...
    妙嗚閱讀 274評論 0 0