主調(diào)函數(shù)是本身固有的數(shù),被調(diào)函數(shù)是通過(guò)其他數(shù)計(jì)算出來(lái)的
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)與策劃設(shè)計(jì),大渡口網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:大渡口等地區(qū)。大渡口做網(wǎng)站價(jià)格咨詢:028-86922220
主調(diào)函數(shù) 調(diào)用別的函數(shù)實(shí)現(xiàn)功能
例如 A是主調(diào)函數(shù) B是被調(diào)函數(shù)
void A()
{
B();
}
python幫助中有對(duì)__main__的說(shuō)明。
每個(gè)文件(模塊)都可以任意寫一些沒(méi)有縮進(jìn)的代碼,并且在載入時(shí)自動(dòng)執(zhí)行,為了區(qū)分主執(zhí)行文件還是被調(diào)用的文件,Python引入了一個(gè)變量__name__,當(dāng)文件是被調(diào)用時(shí),__name__的值為模塊名,當(dāng)文件被執(zhí)行時(shí),__name__為'__main__'。這個(gè)特性,為測(cè)試驅(qū)動(dòng)開(kāi)發(fā)提供了極好的支持,可以在每個(gè)模塊中寫上測(cè)試代碼,這些測(cè)試代碼僅當(dāng)模塊被Python直接執(zhí)行時(shí)才會(huì)運(yùn)行,代碼和測(cè)試完美的結(jié)合在一起。
在Python語(yǔ)言中,可以在函數(shù)中定義函數(shù)。 這種在函數(shù)中嵌套定義的函數(shù)也叫內(nèi)部函數(shù)。我們來(lái)看下面的代碼:
上述代碼中,定義了函數(shù)greet,在函數(shù)greet內(nèi)部又定義了一個(gè)函數(shù)inner_func, 并調(diào)用該函數(shù)打印了一串字符。
我們可以看到,內(nèi)部函數(shù)inner_func的定義和使用與普通函數(shù)基本相同。需要注意的是變量的作用域,在上述代碼中,函數(shù)參數(shù)name對(duì)于全局函數(shù)greet是局部變量,對(duì)內(nèi)部函數(shù)inner_func來(lái)說(shuō)則是非局部變量。內(nèi)部函數(shù)對(duì)于非局部變量的訪問(wèn)規(guī)則類似于標(biāo)準(zhǔn)的外部函數(shù)訪問(wèn)全局變量。
從這個(gè)例子我們還可以看到內(nèi)部函數(shù)的一個(gè)作用,就是通過(guò)定義內(nèi)部函數(shù)的方式將一些功能隱藏起來(lái),防止外部直接調(diào)用。常見(jiàn)的場(chǎng)景是,在一個(gè)復(fù)雜邏輯的函數(shù)中,將一些小的任務(wù)定義成內(nèi)部函數(shù),然后由這個(gè)外層函數(shù)使用,這樣可以使代碼更為清晰,易于維護(hù)。這些內(nèi)部函數(shù)只會(huì)在這個(gè)外層函數(shù)中使用,不能被其他函數(shù)或模塊使用。
在Python語(yǔ)言中, 函數(shù)也是對(duì)象,它可以被創(chuàng)建、賦值給變量,或者作為函數(shù)的返回值。我們來(lái)看下面這個(gè)例子。
在上述代碼中,在函數(shù)gen_greet內(nèi)部定義了inner_func函數(shù),并返回了一個(gè)inner_func函數(shù)對(duì)象。外部函數(shù)gen_greet返回了一個(gè)函數(shù)對(duì)象,所以像gen_greet這樣的函數(shù)也叫工廠函數(shù)。
在內(nèi)部函數(shù)inner_func中,使用了外部函數(shù)的傳參greet_words(非局部變量),以及函數(shù)的參數(shù)name(局部變量),來(lái)打印一個(gè)字符串。
接下來(lái),調(diào)用gen_greet("Hello")創(chuàng)建一個(gè)函數(shù)對(duì)象say_hello,緊接著調(diào)用say_hello("Mr. Zhang"),輸出的結(jié)果為:Hello, Mr. Zhang!
同樣的,調(diào)用gen_greet("Hi")創(chuàng)建一個(gè)函數(shù)對(duì)象say_hi,調(diào)用say_hello("Mr. Zhang"),輸出的結(jié)果為:Hi,Tony!
我們可以發(fā)現(xiàn),gen_greet返回的函數(shù)對(duì)象具有記憶功能,它能夠把所需使用的非局部變量保存下來(lái),用于后續(xù)被調(diào)用的時(shí)候使用。這種保存了非局部變量的函數(shù)對(duì)象被稱作閉包(closure)。
那么閉包是如何實(shí)現(xiàn)的呢?其實(shí)并不復(fù)雜,函數(shù)對(duì)象中有一個(gè)屬性__closure__,它就是在創(chuàng)建函數(shù)對(duì)象時(shí)用來(lái)保存這些非局部變量的。
__closure__屬性是一個(gè)元組或者None類型。在上述代碼中,我們可以通過(guò)下面方式查看:
函數(shù)的嵌套所實(shí)現(xiàn)的功能大都可以通過(guò)定義類的方式來(lái)實(shí)現(xiàn),而且類是更加面向?qū)ο蟮拇a編寫方式。
嵌套函數(shù)的一個(gè)主要用途是實(shí)現(xiàn)函數(shù)的裝飾器。我們看下面的代碼:
在上述代碼中,logger函數(shù)返回函數(shù)with_logging,with_logging則是打印了函數(shù)func的名稱及傳入的參數(shù),然后調(diào)用func, 并將參數(shù)傳遞給func。其中的@wraps(func)語(yǔ)句用于復(fù)制函數(shù)func的名稱、注釋文檔、參數(shù)列表等等,使得with_logging函數(shù)具有被裝飾的函數(shù)func相同的屬性。
代碼中接下來(lái)用@logger對(duì)函數(shù)power_func進(jìn)行修飾,它的作用等同于下面的代碼:
可見(jiàn),裝飾器@符其實(shí)就是上述代碼的精簡(jiǎn)寫法。
通過(guò)了解了嵌套函數(shù)和閉包的工作原理,我們?cè)谑褂眠^(guò)程中就能夠更加得心應(yīng)手了。
有的時(shí)候, 我們希望會(huì)保留列表中的數(shù)據(jù)作為備份,又不希望函數(shù)中不修改列表的值,該怎么做?python中提供了一種方法,將列表的副本傳遞給
函數(shù),這樣函數(shù)修改的只是列表的副本, 不會(huì)修改原列表的內(nèi)容,可以按照下面這樣做:
function_name(list_name[:])
切片表示法[:]創(chuàng)建列表副本.
如下面程序: 我們可以 給print_models 方法傳遞 unprinted_designs[:],這樣原列表?unprinted_designs值的就不會(huì)被修改
def print_models(unprinted_designs ,completed_models):
"""
模擬打印每個(gè)設(shè)計(jì),直到?jīng)]有未打印的設(shè)計(jì)為止
打印每個(gè)設(shè)計(jì)后,都將其移到列表completed_models中
"""
while unprinted_designs:
? ? current_design = unprinted_designs.pop()
? ? #模擬根據(jù)設(shè)計(jì)制作3D打印模型的過(guò)程
? ? print("Printing model:"+current_design)
? ? completed_models.append(current_design)
def show_completed_models(completed_models):
"""顯示打印的所有模型"""
print("\n The following mdels have been printed:")
for completed_model in completed_models:
? ? print(completed_model)
unprinted_designs =['iphone case','robot pendant','dodecahedron']
completed_models = []
print_models(unprinted_designs , completed_models)
show_completed_models(completed_models)
1.定義變量的時(shí)候默認(rèn)是全局變量
2.使用函數(shù)的時(shí)候,函數(shù)默認(rèn)是封閉性的,在函數(shù)內(nèi)使用的變量不能直接函數(shù)外使用
3.如需要使用,可以在變量使用之前聲明這個(gè)變量是全局變量
當(dāng)前標(biāo)題:python函數(shù)封閉調(diào)節(jié) python閉包函數(shù)的作用
網(wǎng)頁(yè)鏈接:http://muchs.cn/article40/hjdgho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、用戶體驗(yàn)、定制網(wǎng)站、企業(yè)網(wǎng)站制作、軟件開(kāi)發(fā)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)