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
的真实性,即 False
当 a==0
或 len(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()
可能有什么副作用。
许多语言中的三元运算符是这样工作的:
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
的真实性,即 False
当 a==0
或 len(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()
可能有什么副作用。