多种语言的三元运算符就像:
x = f() ? f() : g()
如果f()
是真实的,则分配了x
的f()
值,否则将其分配为g()
的值。但是,某些语言具有更简洁的 elvis 运算符,在功能上等效:
x = f() ?: g()
在python中, ternary 运算符表达得像:
x = f() if f() else g()
但是Python是否具有更简洁的 elvis 运算符?
也许类似:
x = f() else g() # Not actually valid python
是
Python确实有猫王操作员。这是有条件的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
nb python dik
a if a is not None else b
a or b
中的or
操作员检查a
的真实性,即False
a==0
或len(a)==0
或其他类似情况。看看什么是真实和虚假的
有一个建议添加此类操作员PEP 505
robᵩ关于使用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()
的任何副作用都可能。
>>> 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 Elvis操作是
(testIsFalse, testIsTrue)[test]
Java等效是
test ? testIsTrue:testIsFalse