- Python 3.6從入門到精通(視頻教學(xué)版)
- 王英英
- 801字
- 2019-12-06 14:20:14
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é)果
- 黑客攻防從入門到精通(實(shí)戰(zhàn)秘笈版)
- 測試驅(qū)動開發(fā):入門、實(shí)戰(zhàn)與進(jìn)階
- Computer Vision for the Web
- Learn to Create WordPress Themes by Building 5 Projects
- Offer來了:Java面試核心知識點(diǎn)精講(原理篇)
- ASP.NET Core Essentials
- 從0到1:HTML+CSS快速上手
- Spring+Spring MVC+MyBatis整合開發(fā)實(shí)戰(zhàn)
- MATLAB 2020從入門到精通
- Windows內(nèi)核編程
- Visual C++程序設(shè)計(jì)與項(xiàng)目實(shí)踐
- Spring Data JPA從入門到精通
- Mastering Leap Motion
- XML程序設(shè)計(jì)(第二版)
- H5頁面設(shè)計(jì)與制作(全彩慕課版·第2版)