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

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