2013-07-24 114 views
-1

嗯,我的確嘗試瞭解Lambda函數,但沒有通過任何鏈接解釋關於它的流程以及python解釋器處理方式的幾個問題,或者我可能無法正確理解它。 我有幾個問題,請有人爲我澄清它們。 下面是代碼:瞭解lambda函數

def f1(n): 
    print 'in f1, value is : ', n 
    return lambda x: x+n 

if __name__ == '__main__': 
    f= f1(100) 
    print f(1) 
    print f(3) 
    print f1(10) 
    print f(5) 
    print type(f1) 

輸出是:

in f1, value is : 100 
101 
103 
in f1, value is : 10 
<function <lambda> at 0x019C66B0> 
105 
<type 'function'> 

我的問題是:

  • 對於f(1)f(3)爲什麼print說法不叫,當 我們叫f1(100)爲什麼lambda語句沒有編譯。
  • 功能f1中的xn之間的關係是什麼。
  • 我想f(5)將在15(10 + 5)
  • 請解釋print f1(10)
  • 另外,請讓我知道什麼是lambda x:在這裏表示,這是塊是x的名字嗎?請解釋。

謝謝大家。

+0

在提出任何問題之前,請嘗試先搜索。請參考此鏈接。 http://stackoverflow.com/questions/1085875/what-is-this-lambda-everyone-keeps-speaking-of/1086347#1086347 –

+0

@tailor_raj:恩,謝謝你的鏈接,但即使在閱讀後,我仍然會問我有點問題,因爲我正在尋找某些特定的解釋(基於python),並且在發佈這個問題之前我也搜索了!我非常期待像你這樣的元素肯定會迴應我的問題的完整性,幾乎每一個問題中都有一個問題!所以我會說停止勸阻人們提問。 – ramd

+0

這不是在勸阻人們。因爲如果你搜索,肯定你會得到更多,然後無論你問。 –

回答

2

首先你應該明白,Python中的所有東西都是一個對象。而且功能確實包含在內。

從您的函數f1()中,您實際上返回了對lambda函數的引用。你可以在任何變量中賦值。

對於例如爲:

>>> f = lambda x: x # Assign reference to lambda function to f. 
# Now you can call lambda function using `f` 
>>> f(1) 
1 

現在,讓我們用你的榜樣前進。你的第一個語句裏面if是:

f = f1(100) 

這種分配等同於:

f = lambda x: x + 100 # Replace `n` with `100` in return statment in `f1`. 

那麼,接下來的兩個呼叫是非常簡單明瞭:

print f(1) # returns `1 + 100` = 101 (Replace `x` with `1`. 
print f(3) # returns `3 + 100` = 103 

所以,現在你xn之間的關係。 'x'替換爲f的參數,'n'替換爲f1的參數。

請解釋打印F1(10)

f1()返回到lambda函數的參考。這就是它將要打印的內容。輸出是一個類似於你在下面的代碼片段獲取:

>>> def func(): 
     return 5 

>>> func 
<function func at 0x021F0F30> 

除了func被替換爲lambda,因爲F1僅返回lambda函數。

我以爲F(5)將在15(10 + 5)

你會得到了輸出,曾在之前的聲明中,你重新分配的f1返回值f。但是,由於您剛剛打印的值爲f(10),因此f仍然綁定到 - lambda x: x + 100。所以你得到105

然後你打印的f1的類型,這是隻有一個功能:

print type(f1) 
+0

很好的解釋。我正在尋找這個答案。現在爲lambda函數帶來了很多的清晰度。再次感謝。只是一個快速的,所以在我的lambda體內,n就像是一個通過覆蓋函數傳遞給lambda函數的變量(本例中爲f1)。 – ramd

+1

@ramd。是的,你可以這麼說。 –

1

A lambda幾乎是另一個功能。要使用它,你也必須調用它。

您將實際的拉姆達返回至f,而不是整個功能f1。除此之外,當你返回它時,lambda不會被調用。這就是爲什麼當你撥打f(1)f(3)時,它實際上並不運行f1,但只有lambda。

還記得我說lambdas是如何功能?那麼x是一個參數,而n是您在f1中定義的本地變量n

f(5) != 15因爲您實際上沒有在任何地方使用f1(10)。你只打印它。如果你做了f = f(10),那麼它會是15

print f1(10)打印的lambda函數(因爲這是什麼被返回)。它不叫它,只是打印它。

1

一個lambda只是在一行寫一個函數的方式。

最初你可能看不到它們的重點,但它們可以用於生成大量稍微不同的函數,或者用於指定可能只能使用一次的函數或所有其他各種實例。

要嘗試理解好一點,想象下面的代碼 - 從自己的略有不同:

def f2(n): 

    def g2(x): 
     return x + n 

    return g2 

這確實非常自己的代碼做了什麼,而是由第一功能中定義的函數,然後返回它。這基本上和你的代碼一樣。