簡體   English   中英

Python lambda返回None而不是空字符串

[英]Python lambda returning None instead of empty string

我有以下lambda函數:

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

如果它接收None作為參數,它應該返回一個空字符串,如果它不是None,則返回參數。

例如:

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

如果我調用f(None)而不是獲得一個空字符串,我會得到None。 我打印了函數返回的類型,我得到了NoneType。 我在期待弦樂。

type('')返回字符串,所以我想知道為什么當我將None作為參數傳遞時,lambda不會返回空字符串。

我對lambdas很新,所以我可能誤解了一些關於它們如何工作的事情。

使用if else結構

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

在你的情況下''的問題被認為是布爾假。 bool('')== False。 您可以使用

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

問題是Python將空字符串視為False。 將None傳遞給函數時,它的計算結果為:

None == None and '' or None

哪(有效)成為:

True and False or None

然后:

False or None

最后:

None

一個解決方案是:

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

如果您知道x將是字符串或None,那么您可以利用以下事實:在Python中,None也是一個False值:

lambda x: x or ''

Python中給出了and比更高的優先級or ,所以括號這里掉落:

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

當傳遞None ,它變為(True and '') or None Python的布爾運算符通過返回一個或另一個參數(這是一個小技巧)來工作,所以這會減少為'' or None ,最后是None

這個小技巧源於Python 2.5之前,它沒有條件運算符 您剛剛遇到的警告是,當True分支具有False值時,它不會按預期運行。 除非你關心Python≤2.4,否則只需使用條件運算符。

這里不是lambdas問題。 這是你在那里使用的pythonic if / else表達式。

(condition) and (expression1) or (expression2)大部分時間是指(condition) ? (expression1) : (expression2) (condition) ? (expression1) : (expression2)你期望,除非expression1計算結果為False。

這是因為整個事情是按順序評估的。 如果condition失敗,則計算expression1 如果為True ,則由於短路評估而返回,因此預期的行為。 如果不是,則返回expression2 ''評價為假。

嘗試短路評估

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM