我有以下lambda函数:
f = lambda x: x == None and '' or x
如果它接收None作为参数,它应该返回一个空字符串,如果它不是None,则返回参数。
例如:
>>> f(4)
4
>>> f(None)
>>>
如果我调用f(None)而不是获得一个空字符串,我会得到None。我打印了函数返回的类型,我得到了NoneType。我期待着字符串。
type('')返回字符串,所以我想知道为什么当我将None作为参数传递时,lambda不会返回空字符串。
我对lambdas很新,所以我可能误解了一些关于它们是如何工作的事情。
答案 0 :(得分:20)
使用if else构造
f = lambda x:'' if x is None else x
答案 1 :(得分:8)
你的情况中的问题是''被认为是布尔值False。 bool('')== False。 你可以使用
f =lambda x:x if x is not None else ''
答案 2 :(得分:4)
问题是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 ''
答案 3 :(得分:3)
Python使and
的优先级高于or
,因此括号将落在此处:
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 :(得分:2)
这里不是lambdas的问题。这是你在那里使用的pythonic if / else表达式。
(condition) and (expression1) or (expression2)
大部分时间都代表您期望的(condition) ? (expression1) : (expression2)
,除非expression1
评估为False。
这是因为整个事情是按顺序评估的。如果condition
失败,则会评估expression1
。如果是True
,则由于短路评估而返回,因此预期的行为。如果不是,则返回expression2
。 ''
评估为False。
答案 5 :(得分:2)
>>> g = lambda x: x or ''
>>> g(3)
3
>>> g(None)
''
>>> # beware that ...
>>> g(0)
''