??? Python對于將函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)調(diào)用是非常方便的,只要你在函數(shù)中將調(diào)用的參數(shù)按照函數(shù)處理進(jìn)行調(diào)用,這種操作就能順利完成。如:
?? def S(n):
????????? sum=0
????????? for i in range(n): sum+=i
????????? return sum
?
?? def P(f):
????????? a=eval(input('輸入一個(gè)數(shù)'))
????????? print('數(shù)的累加為:'f(a))
??? 運(yùn)行P(S),即能夠從鍵盤獲得輸入并打印出結(jié)果。這里將函數(shù)S作為參數(shù)傳遞給P是非常方便的。而在P中,之所以將參數(shù)f認(rèn)為是函數(shù),則是因?yàn)閷λ氖褂檬前凑蘸瘮?shù)進(jìn)行的。
??? 在Python中,修飾器是C++等其它語言中沒有的新特性,通過修飾器的定義,可以對一個(gè)對象在其外部通過修飾器對其進(jìn)行修改,而不用修改這個(gè)對象本身。如下:
?? def myDec(f):????????????????????? #定義一個(gè)函數(shù),該函數(shù)以另一個(gè)函數(shù)f作為參數(shù)
????????? if(f()>=5): lambda:return f()*2
????????? else: return lambda:f()
?
?? @myDec?????????????????????????????????? #定義一個(gè)下面的Hello對象的myDec修飾器
?? def Hello():
????????? return eval(input('輸入一個(gè)數(shù)'))
??? 在上面的例子中首先定義了一個(gè)函數(shù)myDec,函數(shù)接收一個(gè)函數(shù)參數(shù)。該函數(shù)就可以被修飾器作用用來修飾其它函數(shù)對象了。
??? 下面定義了一個(gè)函數(shù)Hello,該函數(shù)將myDec作為修飾器。當(dāng)修飾器定義完成后,Python解釋器會(huì)自動(dòng)調(diào)用函數(shù)Hello并將修飾器作用于Hello,即相當(dāng)于進(jìn)行了如下表達(dá)式的函數(shù)調(diào)用:
??? Hello=myDec(Hello)
??? 其結(jié)果是把函數(shù)myDec中的效果施加在了函數(shù)Hello之上。在本例中,如果用戶輸入的數(shù)大于等于5,最后形成的Hello函數(shù)實(shí)際上是對原Hello函數(shù)乘以2,否則就是原Hello函數(shù),從而在沒有修改Hello的基礎(chǔ)上完成了對Hello的修改或者修飾。
通過這個(gè)例子我們可以注意有以下幾個(gè)要點(diǎn):
- 對被修飾對象的修改和修飾是由修飾器函數(shù)完成的(本例中的myDec),該函數(shù)由于要對被修飾對象進(jìn)行修飾,所以應(yīng)該首先定義,并接收一個(gè)被修飾對象參數(shù),以便完成對該對象的修飾;
- 如例子中所表達(dá)的,修飾器實(shí)際完成的是被修飾對象通過修飾函數(shù)進(jìn)行修飾的操作,即如例子的Hello=myDec(Hello),所以修飾函數(shù)的返回值最終將作用于被修飾對象。所以從邏輯上講,修飾器函數(shù)應(yīng)該返回與被修飾對象相同的對象,如例子中通過無名函數(shù)返回的依然是相類似的函數(shù)。當(dāng)然,理論上講,修飾器函數(shù)完全可以返回其它任何類型的對象,當(dāng)然這樣的結(jié)果實(shí)際上就完全修改了被修飾對象,所以一般不要這么做,以免發(fā)生不可預(yù)料的結(jié)果;
- 修飾器只在定義完成后立即執(zhí)行,所以其修飾作用會(huì)立刻發(fā)生,之后只要沒有重新運(yùn)行修飾器定義,該作用會(huì)保持不變。如例子中函數(shù)Hello從鍵盤接收并返回一個(gè)輸入。當(dāng)修飾器定義完成后,Python編輯器會(huì)立即運(yùn)行修飾器,并通過修飾函數(shù)調(diào)用被修飾函數(shù)Hello,要求用戶提供一個(gè)輸入。這時(shí)如果用戶輸入大于等于5,這時(shí)Hello函數(shù)會(huì)被修飾為返回2*用戶輸入的值,之后如果再次運(yùn)行函數(shù)Hello,不管用戶輸入是否大于等于5,都會(huì)返回2*用戶輸入值了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
