官术网_书友最值得收藏!

6.8 返回函數(shù)

在Python語言中,函數(shù)不僅可以作為其他函數(shù)的參數(shù),還可以作為其他函數(shù)的返回結(jié)果。

下面通過示例來學(xué)習(xí)返回函數(shù)的用法。

運(yùn)行結(jié)果如圖6-34所示。

圖6-34 運(yùn)行結(jié)果

從運(yùn)行結(jié)果可以看出,直接調(diào)用f1()函數(shù)時(shí),沒有返回求絕對值的結(jié)果,而是返回了一串字符(這個(gè)字符其實(shí)就是函數(shù))。當(dāng)執(zhí)行m()函數(shù)時(shí),才真正計(jì)算絕對值的結(jié)果。

在上述示例中,函數(shù)f1()又定義了一個(gè)f2()函數(shù),并且內(nèi)部函數(shù)f2()可以引用外部函數(shù)f1()的參數(shù)。當(dāng)函數(shù)f1()返回函數(shù)f2()時(shí),相關(guān)參數(shù)都保存在返回函數(shù)中,稱為閉包。

注意 當(dāng)調(diào)用f1()函數(shù)時(shí),每次調(diào)用都會返回一個(gè)新的函數(shù),即使傳入相同的參數(shù)也是如此。例如:

運(yùn)行結(jié)果如圖6-35所示。

圖6-35 運(yùn)行結(jié)果

從運(yùn)行結(jié)果可以看出,返回的函數(shù)m1和m2不同。

如果在一個(gè)內(nèi)部函數(shù)里對外部作用域(不是全局作用域)的變量進(jìn)行引用,內(nèi)部函數(shù)就稱為閉包。

例如:

運(yùn)行結(jié)果如圖6-36所示。

圖6-36 運(yùn)行結(jié)果

在上述示例中,函數(shù)f2對函數(shù)f1的參數(shù)n進(jìn)行了引用,將帶參數(shù)的函數(shù)f1給一個(gè)新的函數(shù)p1。當(dāng)函數(shù)f1的生命周期結(jié)束時(shí),已經(jīng)引用的變量n存放在函數(shù)f2中,依然可以調(diào)用。

【例6.5】閉包中引用循環(huán)參數(shù)(源代碼\ch06\6.5.py)。

在本示例中,每次循環(huán)都創(chuàng)建一個(gè)新函數(shù),最后把3個(gè)函數(shù)都返回了。那么執(zhí)行該函數(shù)得到的結(jié)果是什么?

保存并運(yùn)行程序,結(jié)果如圖6-37所示。

圖6-37 運(yùn)行結(jié)果

從運(yùn)行結(jié)果可以看出,3個(gè)函數(shù)返回的結(jié)果均為9。此時(shí)讀者可能會有疑問,為什么調(diào)用函數(shù)f1()、f2()和f3()的結(jié)果不是1、4和9呢?

出現(xiàn)上述結(jié)果的原因是返回的函數(shù)引用了變量i,但并非立刻執(zhí)行,等到3個(gè)函數(shù)都返回時(shí),它們所引用的變量i已經(jīng)變成了3,因此最終結(jié)果均為9。

注意 盡量避免在閉包中引用循環(huán)變量,或者后續(xù)會發(fā)生變化的變量,否則會出現(xiàn)意外情況。

如果一定需要引用循環(huán)變量,那么可以增加一個(gè)函數(shù),并且使用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值。

例如將上面的示例修改如下:

【例6.6】閉包中引用循環(huán)變量,綁定循環(huán)變量當(dāng)前的值(源代碼\ch06\6.6.py)。

保存并運(yùn)行程序,結(jié)果如圖6-38所示。

圖6-38 運(yùn)行結(jié)果

主站蜘蛛池模板: 得荣县| 遂川县| 五河县| 花莲县| 金平| 永靖县| 威远县| 苗栗市| 无极县| 彰化县| 安仁县| 瑞昌市| 宁津县| 娱乐| 和政县| 临海市| 鄂伦春自治旗| 聂拉木县| 通渭县| 烟台市| 石柱| 潢川县| 邹平县| 秦皇岛市| 荔波县| 铅山县| 延川县| 古田县| 岚皋县| 宁城县| 邛崃市| 巴彦淖尔市| 肇东市| 凤凰县| 屏东市| 扶风县| 财经| 清徐县| 讷河市| 丰县| 耒阳市|