python 函數(shù)式編程之返回函數(shù)

python學(xué)習(xí)筆記,特做記錄仪搔,分享給大家,希望對(duì)大家有所幫助蜻牢。

返回函數(shù)

函數(shù)作為返回值

高階函數(shù)除了可以接受函數(shù)作為參數(shù)外烤咧,還可以把函數(shù)作為結(jié)果值返回。

我們來實(shí)現(xiàn)一個(gè)可變參數(shù)的求和孩饼。通常情況下髓削,求和的函數(shù)是這樣定義的:

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

但是,如果不需要立刻求和镀娶,而是在后面的代碼中立膛,根據(jù)需要再計(jì)算怎么辦?可以不返回求和的結(jié)果梯码,而是返回求和的函數(shù):

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

f = lazy_sum(1, 3, 5, 7, 9)
print f

運(yùn)行結(jié)果:

<function sum at 0x10d92e6e0>

Process finished with exit code 0

調(diào)用函數(shù)f時(shí)宝泵,才真正計(jì)算求和的結(jié)果:

print f()

在這個(gè)例子中,我們?cè)诤瘮?shù)lazy_sum中又定義了函數(shù)sum轩娶,并且儿奶,內(nèi)部函數(shù)sum可以引用外部函數(shù)lazy_sum的參數(shù)和局部變量,當(dāng)lazy_sum返回函數(shù)sum時(shí)鳄抒,相關(guān)參數(shù)和變量都保存在返回的函數(shù)中闯捎,這種稱為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力。

請(qǐng)?jiān)僮⒁庖稽c(diǎn)许溅,當(dāng)我們調(diào)用lazy_sum()時(shí)瓤鼻,每次調(diào)用都會(huì)返回一個(gè)新的函數(shù),即使傳入相同的參數(shù):

f1 = lazy_sum(1, 3, 5, 7, 9)
f2 = lazy_sum(1, 3, 5, 7, 9)
print f1 == f2

運(yùn)行結(jié)果:

False

Process finished with exit code 0

f1()和f2()的調(diào)用結(jié)果互不影響贤重。

閉包

注意到返回的函數(shù)在其定義內(nèi)部引用了局部變量args茬祷,所以,當(dāng)一個(gè)函數(shù)返回了一個(gè)函數(shù)后并蝗,其內(nèi)部的局部變量還被新函數(shù)引用祭犯,所以秸妥,閉包用起來簡單,實(shí)現(xiàn)起來可不容易沃粗。

另一個(gè)需要注意的問題是粥惧,返回的函數(shù)并沒有立刻執(zhí)行,而是直到調(diào)用了f()才執(zhí)行陪每。我們來看一個(gè)例子:

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()
print f2()
print f3()

在上面的例子中影晓,每次循環(huán),都創(chuàng)建了一個(gè)新的函數(shù)檩禾,然后挂签,把創(chuàng)建的3個(gè)函數(shù)都返回了。

你可能認(rèn)為調(diào)用f1()盼产,f2()和f3()結(jié)果應(yīng)該是1饵婆,4,9戏售,但實(shí)際結(jié)果是:

9
9
9

Process finished with exit code 0

全部都是9侨核!原因就在于返回的函數(shù)引用了變量i,但它并非立刻執(zhí)行灌灾。等到3個(gè)函數(shù)都返回時(shí)搓译,它們所引用的變量i已經(jīng)變成了3,因此最終結(jié)果為9锋喜。

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

如果一定要引用循環(huán)變量怎么辦嘿般?方法是再創(chuàng)建一個(gè)函數(shù)段标,用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無論該循環(huán)變量后續(xù)如何更改炉奴,已綁定到函數(shù)參數(shù)的值不變:

def count1():
    def m(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(m(i))
    return fs
m1, m2, m3 = count1()
print m1()
print m2()
print m3()

再看看結(jié)果:

1
4
9

Process finished with exit code 0

缺點(diǎn)是代碼較長逼庞,可利用lambda函數(shù)縮短代碼。

希望可以幫助大家
如果哪里有什么不對(duì)或者不足的地方瞻赶,還望讀者多多提意見或建議
如需轉(zhuǎn)載請(qǐng)聯(lián)系我赛糟,經(jīng)過授權(quán)方可轉(zhuǎn)載,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砸逊,一起剝皮案震驚了整個(gè)濱河市虑灰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痹兜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤诀,死亡現(xiàn)場離奇詭異字旭,居然都是意外死亡对湃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門遗淳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍柒,“玉大人,你說我怎么就攤上這事屈暗〔鹧叮” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵养叛,是天一觀的道長种呐。 經(jīng)常有香客問我,道長弃甥,這世上最難降的妖魔是什么爽室? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮淆攻,結(jié)果婚禮上阔墩,老公的妹妹穿的比我還像新娘。我一直安慰自己瓶珊,他們只是感情好啸箫,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伞芹,像睡著了一般忘苛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丑瞧,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天柑土,我揣著相機(jī)與錄音,去河邊找鬼绊汹。 笑死稽屏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的西乖。 我是一名探鬼主播狐榔,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼获雕!你這毒婦竟也來了薄腻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤届案,失蹤者是張志新(化名)和其女友劉穎庵楷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尽纽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年咐蚯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄贿。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡春锋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出差凹,到底是詐尸還是另有隱情期奔,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布危尿,位于F島的核電站呐萌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脚线。R本人自食惡果不足惜搁胆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邮绿。 院中可真熱鬧渠旁,春花似錦、人聲如沸船逮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖胃。三九已至杂靶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酱鸭,已是汗流浹背吗垮。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凹髓,地道東北人烁登。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蔚舀,于是被迫代替她去往敵國和親饵沧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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