2015-07-20 126 views
0

感謝您閱讀我的問題。由於我還不熟悉Python,因此我想問一下Python中的()。Python函數和裝飾器中的括號(包裝)

def addOne(myFunc): 
    def addOneInside(): 
     return myFunc() + 1 
    return addOneInside # <-----here is the question 

@addOne 
def oldFunc(): 
    return 3 

print oldFunc() 

請注意,在第四行,雖然程序返回一個函數,但它不需要括號()。爲什麼它不會出現語法錯誤的錯誤?提前感謝您的回答!

+0

壓痕。 Python使用它來確定函數的開始和結束。在addOne函數內添加一級縮進。 – bsa

+2

哪個版本的python?什麼是確切的語法錯誤? – ReyCharles

+0

您必須真正向我們展示Python向您展示的確切錯誤。正如我所看到的,對於Python 2.7來說,一切都應該正常工作,但是我們需要知道Ptyhon版本的錯誤行和錯誤消息。謝謝 – madtyn

回答

2

圓括號用於運行函數,但沒有它們,名稱仍像變量一樣引用該函數。

return myFunc() + 1 

這將評估myFunc函數,爲其值加1,然後返回該值。括號是爲了讓函數運行並返回一個數值所需要的。

return addOneInside 

這是不實際運行addOneInside,它僅僅是返回函數的變量。您可以將其分配給其他名稱並存儲以備後用。你理論上可以這樣做:

plusOne = addOneInside 
plusOne() 

它實際上會調用addOneInside函數。

您最初的問題中的特定實例被稱爲裝飾器,它是您對傳遞給您的函數的參數執行代碼的一種方式。你的例子不是很實用,但我可以修改它以顯示一個簡單的用例。

假設您只想將正數傳遞給您的函數。如果myFunc傳遞的是負數,則需要將其更改爲0.可以使用像這樣的裝飾器來管理它。

def addOne(myFunc): 
    def addOneInside(num): 
     if num < 0: 
      num = 0 
     return myFunc(num) 
    return addOneInside # <-----here is the question 

@addOne 
def oldFunc(number): 
    return number 

爲了解釋,該@addOne是修飾語法,它的連接上參數/ S的,只要你把它oldFunc被稱爲addOneInside功能。所以,現在這裏的一些示例輸出:

oldFunc(-12) 
>>> 0 
oldFunc(12) 
>>> 12 

所以,現在你可以添加邏輯來oldFunc是獨立操作參數的分析邏輯的。你也可以相對容易地改變允許的參數。也許還有一個最大上限,或者你希望它記錄或注意到該值不應該是負值。您也可以將這個裝飾器應用於多個功能,並且它們將在所有這些功能上執行相同的操作。

This blogpost爲我解釋了很多,所以如果這個信息太簡單了就不清楚了,請嘗試閱讀那裏的詳細解釋。

+0

感謝您的詳細解釋!但是對於第1行def addOne(myFunc):爲什麼我不應該使它成爲myFunc()? – JetLag

+0

@Steven我擴展了我的答案,這是一個非常複雜的話題,我不確定你對Python有多熟悉,所以我希望我已經清楚了。 – SuperBiasedMan

+0

我真的很感謝你的回答!我一定會花時間消化你的答案並閱讀你推薦的博文。謝謝你的時間。我現在更清楚這個概念:) 我只是想知道你們是如何從頭開始學習的?對我有什麼建議?我是心理學專業的學生。 – JetLag

0

您在函數addOne()中的縮進不正確(我已修復它),但我不認爲這是您的問題。

如果使用的是Python3,然後print是一個函數,必須像這樣調用:

print(oldFunc()) 
+0

當涉及語法錯誤時,請不要「糾正」問題中的代碼! – ReyCharles

+0

@ReyCharles:如果實際上在該代碼塊中存在語法錯誤,那將是一個有效的點,但是,沒有。 'print'語句存在潛在的語法錯誤,並且已經完成。 – mhawke

+0

感謝您幫助我解決小問題。它可以幫助他人更清楚地閱讀我的問題! – JetLag