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

时间:2010-04-03 20:27:15

标签: python lambda

我有以下lambda函数:

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

如果它接收None作为参数,它应该返回一个空字符串,如果它不是None,则返回参数。

例如:

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

如果我调用f(None)而不是获得一个空字符串,我会得到None。我打印了函数返回的类型,我得到了NoneType。我期待着字符串。

type('')返回字符串,所以我想知道为什么当我将None作为参数传递时,lambda不会返回空字符串。

我对lambdas很新,所以我可能误解了一些关于它们是如何工作的事情。

6 个答案:

答案 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)

尝试short-circuit evaluation

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