[英]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.