2010-04-03 35 views
7

的,我有以下lambda函數:Python的拉姆達返回無不是空字符串

f = lambda x: x == None and '' or x 

如果收到無作爲的說法應該返回一個空字符串,或參數,如果它不是無。

例如:

>>> f(4) 
4 
>>> f(None) 
>>> 

如果我叫F(無),而不是得到一個空字符串,我得到無。我打印了函數返回的類型,並得到了NoneType。我期待着絃樂。

類型('')返回字符串,所以我想知道爲什麼當我傳遞None作爲參數時,lambda不返回空字符串。

我對lambda表達式相當陌生,所以我可能會誤解一些關於它們的工作方式。

+2

你已經犯了典型的失誤之一... – PaulMcG 2010-04-03 20:43:56

回答

17

使用if else構造

f = lambda x:'' if x is None else x 
2

這不是lambda,這是問題在這裏。這是你在那裏使用的pythonic if/else表達式。

(condition) and (expression1) or (expression2)大部分時間意味着您期望的(condition) ? (expression1) : (expression2),除非expression1評估爲False。

這是因爲整個事情按順序進行評估。如果condition失敗,則評估expression1。如果它是True,則由於短路評估而返回,因此是預期行爲。如果不是,則返回expression2''評估爲False。

+0

是和/或圖案不是很pythonic ..不要使用它!保持簡單,愚蠢! – 2010-04-03 20:32:20

8

在你的情況下,''被視爲布爾假的問題。布爾('')==假。 您可以使用

f =lambda x:x if x is not None else '' 
2

嘗試short-circuit evaluation

>>> g = lambda x: x or '' 
>>> g(3) 
3 
>>> g(None) 
'' 
>>> # beware that ... 
>>> g(0) 
'' 
+0

我不認爲'g(0)'返回OP想要的東西。 – 2010-04-03 20:37:17

2

的Python給andor的優先級高,所以括號落在這裏:

lambda x: (x == None and '') or x 

當通過None時,這變成(True and '') or None。 Python的布爾運算符通過返回一個參數或另一個參數(因此這個小技巧)工作,所以這減少到'' or None,最後是None

這個小竅門源於Python 2.5之前,它沒有conditional operator。您剛纔遇到的警告是,它的行爲不如預期的True分支具有False的價值。除非你關心Python≤2.4,否則就使用條件運算符。

4

問題是Python將空字符串視爲False。當你通過無給你的函數,計算結果爲:

None == None and '' or None 

其(有效)變爲:

True and False or None 

則:

False or None 

最後:

None 

一個解決方案是:

lambda x: x if x is not None else '' 

如果你知道x將是字符串或無,那麼你可以利用一個事實,即無也是在Python False值:

lambda x: x or ''