2017-05-18 72 views
-2

我沒有得到第二個功能有人可以幫助我第二個功能是什麼我獨自學習了這個功能請以非常基本的方式向我解釋我是初學者和python 3.x中的基本功能

def add(x, y): 
    return x + y 

def do_twice(func, x, y): 
    return func(func(x, y), func(x, y)) 

a = 5 
b = 10 

print(do_twice(add, a, b)) 
+0

結果是什麼?它爲什麼會令人困惑?更新問題。 –

回答

3

Python支持高階編程:您可以傳遞一個函數作爲參數(實際上Python在傳遞參數時並不關心該類型)。

那麼如果你打電話do_twice(add, a, b)會發生什麼?那麼你打電話do_twicefunction = add,x = 5y = 10。現在,我們檢查的do_twice身體:

return func(func(x,y),func(x,y)) 

Python解釋器會解釋這一說法,並首先評估func(x,y)(左一個)。所以它叫add(5,10)。我假設你明白add函數是如何工作的,以便函數返回15。接下來,Python評估func(x,y)(正確的),因此它再次調用add(5,10),其中評估15

最後它調用func(15,15),因爲func = add,因此它調用add(15,15)這將導致30。這是返回的結果。

如果你會叫do_twicelambda表達式像:

do_twice(lambda x,y: x+2*y,5,10) 

這樣的結果將是:75。因爲(lambda x,y:x+2*y)(5,10)25(lambda x,y:x+2*y)(25,25)75

+0

我真的很感謝你的回答。謝謝,我終於明白了,因爲你。 –

1

你也可以寫你的第二個功能是這樣的:

def do_twice(func, x, y): 
    val1 = func(x, y) 
    val2 = func(x, y) 
    val3 = func(val1 , val2) 
    return val3 

這樣,你基本上只是存儲每一個臨時變量的3個電話給func(VAL1,VAL2,VAL3)的結果。

現在,如果你調用print(do_twice(add, a, b))與你的價值觀5和10會發生以下情況:

def do_twice(func, x, y): 
    # x = 5, b = 10 
    val1 = func(x, y) 
    # val1 = 5+10 = 15 
    val2 = func(x, y) 
    # val2 = 5+10 = 15 
    val3 = func(val1, val2) 
    # val3 = 15+15 = 30 
    return val3 
+0

但函數意味着添加,因爲我們從來沒有創建一個變量來分配func來添加我的代碼,或者它只是意味着上面的函數 –

+0

函數也是Python中的對象,可以作爲參數傳遞給其他函數。通過調用''print(do_twice(add,a,b))''''''''''''''''''''函數''add''作爲參數傳遞給''do_twice'' - 但**''do_twice''裏面的參數是現在叫做''func''(根據def do_twice(func,x,y)的聲明:''你傳遞給函數的第一個東西被參數''func''引用)。但''func''仍然指向函數''add''。因此,通過在do_twice內部執行''func(x,y)'',它和執行'add(x,y)''一樣。 –

0

第二隻是簡單地採用第一功能和應用提供的輸入到它。 do_twice使用一個叫做func的函數。 func需要兩個位置參數來工作func的一個例子是add(),它需要x和y。所以do_twice()需要add()並將x和y提供給它,然後返回答案。 do_twice因此返回add(add(x,y),add(x,y))