2016-10-22 71 views
0

我是學裝飾的概念蟒蛇從以下鏈接:python中的裝飾器,它們如何生成函數?

http://www.python-course.eu/python3_decorators.php

我在它下面的代碼片段一個基本的疑問:

def f(x): 

    def g(y): 
     return y + x + 3 
    return g 

nf1 = f(1) 

nf2 = f(3) 

print(nf1(1)) 

print(nf2(1)) 

在這個頁面中,寫成最後兩行的輸出分別爲'5'和'7'。 但是,正如我所看到的,我們只傳遞'x'的值,它從哪裏得到'y'的值?它如何爲'Y'賦值來計算輸出?

+0

這些是關閉,而不是裝飾。裝飾器將*函數*作爲參數,並根據輸入返回一個新函數。閉包(大致)是一個函數,它可以在定義的範圍內「記住」局部變量的值。這兩個概念相關,因爲裝飾器通常會返回一個調用原始函數的閉包。 – chepner

+0

也就是說,'g'是一個閉包,'f'只是一個返回閉包的函數。 – chepner

回答

1

函數f創建並返回一個名爲g的新函數。

因此,該代碼通過傳遞x=1x=3創建兩個g功能:

nf1 = f(1) 

nf2 = f(3) 

然後g功能(存儲在nf1nf2)被調用的參數y=1

print(nf1(1)) 

print(nf2(1)) 

也許(或者可能不),如果他們寫出了相同的結果,這將更容易理解:

print(f(1)(1)) # x=1, y=1 
print(f(3)(1)) # x=3, y=1 
+0

你能否澄清一下爲什麼y = 1? –

+0

@itpdusra'nf1' **是**'g',因爲'f'返回'g'。函數'g'帶有一個參數:'y',所以'nf1'只有一個參數:'y',因爲'nf1'是'g'。我期望這部分更容易理解;)真正棘手的問題是'nf1'和'nf2'具有不同的'x'值,當它們都是'g'時。爲此,閱讀[關於閉包的這個答案]可能會很好(http://stackoverflow.com/a/4020443/389289)(儘管這是一個更高級的話題)。 – zvone