2014-05-24 78 views
0

我已經找到了這個網頁:爲什麼Python不允許lambda表達式的局部範圍內的語句?

http://effbot.org/pyfaq/why-can-t-lambda-forms-contain-statements.htm

然而,它不是那麼清楚,爲什麼原因。蘭巴達斯是強大的,在我看來,如果有可能在他們的範圍內使用陳述/作業,他們會更多。

例如:(?也許是爲了避免使用它們太多,而不是一個簡單的DEF)

y = 0 
f = lambda x: y = 5, x+y # Statements first, expression later. 
print f(5) # 10 

一定有人考慮這一點,必須有一個原因,它沒有實現。

+2

爲什麼不'lambda x:x + 5'?此外,可能重複http://stackoverflow.com/questions/1233448/no-multiline-lambda-in-python-why-not – jayelm

+1

@JesseMu:雖然我不會說一個確切的重複,但第二個答案是,我相信OP正在尋找。 – Dair

+1

因爲它使可讀性變差。同樣給匿名函數的名字有點違背了這一點。 –

回答

3

首先需要了解lambda構造創建了一個表達式,其計算結果爲創建的函數。這與作爲陳述的def完全不同,它的作用是將創建的函數綁定到指定名稱的副作用。要使lambda有用,它必須是必須是是一個表達式,否則您不能將它嵌套在其他表達式中。

正如鏈接FAQ解釋的,不允許其他Python表達式嵌套語句。這是因爲Python語言的核心語法折衷排除了這種可能性,如persuasively argued by Guido。由於存在一種非常簡單的解決方法,即使用def,因此認爲不值得使用該語言的語法來容納lambda中的語句。請注意,lambda不是語言中唯一需要表達式的地方。您不能在ifwhile的測試中聲明,也不能在for聲明所要求的表達中聲明。然而,這被認爲是一件好事 - 如果您需要在那裏發表聲明,只需將它們提取到函數中並調用它即可。與lambda完全相同。

0

之間有什麼不同:

f = lambda x: y = 5; x+y 

def f(x): 
    y = 5 
    return x+y 

後者更具可讀性,它具有一致的語法,並且唯一需要編寫的代碼多於使用lambda定義的代碼return。所以你的建議沒有必要,只有更復雜的規則。

相關問題