Python有猫王操作员吗?



多种语言的三元运算符就像:

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

如果f()是真实的,则分配了xf()值,否则将其分配为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 具有 null-coalescing 运算符:

a if a is not None else b

a or b中的or操作员检查a的真实性,即False a==0len(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

最新更新