Python 有 Elvis 运算符吗?

Does Python have the Elvis operator?

许多语言中的三元运算符是这样工作的:

x = f() ? f() : g()

如果f()为真则x赋值为f(),否则赋值为g()。然而,一些语言有一个更简洁的 elvis operator ,它在功能上是等价的:

x = f() ?: g()

在python中,三元运算符表示如下:

x = f() if f() else g()

但是 python 有更简洁的 elvis 运算符吗?

可能是这样的:

x = f() else g() # Not actually valid python

Python 确实有 elvis 运算符。它是条件 or 运算符:

x = f() or g()

f() 被评估。如果为真,则 x 被赋予 f() 的值,否则 x 被赋予 g().

的值

参考:https://en.wikipedia.org/wiki/Elvis_operator#Analogous_use_of_the_short-circuiting_OR_operator

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4]
>>> a + (b,c)[b>c]
[1, 2, 3, 4]
>>> a + (b,c)[b<c]
[1, 2, 3, 4, 5, 6]
>>> 

Python猫王操作是

(testIsFalse, testIsTrue)[test]

Java等价于

test ? testIsTrue:testIsFalse

NB Python not 是否定义了 null-coalescing 运算符通过:

a if a is not None else b

a or b 中的 or 运算符检查 a 的真实性,即 Falsea==0len(a)==0 或其他类似情况时.参见

有人提议添加此类运算符PEP 505

关于使用or是一个很好的建议。但是,作为对原始问题的评论,

x = f() ? f() : g()

在功能上等同于

x = f() ?: g()

只有 f() 没有副作用。

例如,如果 f() 从流或生成器中读取,则调用两次与调用一次的结果不同。稍微重写为 Python 语法,以下示例

values = (x for x in (1, 2, 3))
def f(): return next(values)
def g(): return 42
x = f() if f() else g()
print(x)

将打印 2,而 x = f() or g() 将打印 1。

最好将问题表述为

tmp = f()
x = tmp ? tmp : g()

或者,在 Python,

tmp = f()
x = tmp if tmp else g()

或在 Python 3.8 及更高版本中,

x = tmp if (tmp := f()) else g()

后两个例子都等同于

x = f() or g()

不管 f() 可能有什么副作用。