日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

關于Python的修飾器(一)

系統 1684 0

??? 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的修改或者修飾。

通過這個例子我們可以注意有以下幾個要點:

  1. 對被修飾對象的修改和修飾是由修飾器函數完成的(本例中的myDec),該函數由于要對被修飾對象進行修飾,所以應該首先定義,并接收一個被修飾對象參數,以便完成對該對象的修飾;
  2. 如例子中所表達的,修飾器實際完成的是被修飾對象通過修飾函數進行修飾的操作,即如例子的Hello=myDec(Hello),所以修飾函數的返回值最終將作用于被修飾對象。所以從邏輯上講,修飾器函數應該返回與被修飾對象相同的對象,如例子中通過無名函數返回的依然是相類似的函數。當然,理論上講,修飾器函數完全可以返回其它任何類型的對象,當然這樣的結果實際上就完全修改了被修飾對象,所以一般不要這么做,以免發生不可預料的結果;
  3. 修飾器只在定義完成后立即執行,所以其修飾作用會立刻發生,之后只要沒有重新運行修飾器定義,該作用會保持不變。如例子中函數Hello從鍵盤接收并返回一個輸入。當修飾器定義完成后,Python編輯器會立即運行修飾器,并通過修飾函數調用被修飾函數Hello,要求用戶提供一個輸入。這時如果用戶輸入大于等于5,這時Hello函數會被修飾為返回2*用戶輸入的值,之后如果再次運行函數Hello,不管用戶輸入是否大于等于5,都會返回2*用戶輸入值了。

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 波密县| 聂荣县| 临洮县| 阿克陶县| 哈密市| 禹州市| 辛集市| 伊金霍洛旗| 玉树县| 遵化市| 赫章县| 资阳市| 河池市| 鲁山县| 长春市| 信丰县| 祁连县| 三明市| 墨江| 康马县| 泸溪县| 青岛市| 新营市| 大港区| 延川县| 会昌县| 上高县| 遵义市| 五台县| 尚义县| 江山市| 乳山市| 芒康县| 红安县| 浏阳市| 东乡县| 佳木斯市| 交口县| 阿克陶县| 尉氏县| 太仆寺旗|