【问题标题】:Does Python have the Elvis operator?Python 有 Elvis 运算符吗?
【发布时间】:2018-02-15 17:31:35
【问题描述】:

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

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 conditional-operator


【解决方案1】:

是的

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

【讨论】:

  • 是的,我找不到任何提到“elvis operator”的地方,但这在功能上是等效的。谢谢。
  • 而且我以前从未听说过“猫王操作员”。
  • 如果您将?: 解释为笑脸,则问号的卷曲类似于猫王的标志性发型。
  • 这不等同于 Elvis 运算符,它是 三元 运算符,而 or 是二元运算符。含义:您无法根据其他条件h()来决定是调用f()还是g()
  • @Cromax,您似乎将猫王运算符 (a ?: b) 与三元运算符 (c ? a : b) 混为一谈。它们不是同一件事。例如,请参阅en.m.wikipedia.org/wiki/Elvis_operator
【解决方案2】:

NB Python 确实 notnull-coalescing 运算符定义:

a if a is not None else b

a or b 中的or 运算符在a==0len(a)==0 或其他类似情况下检查a 的真实性,即False。见What is Truthy and Falsy

有提议添加这样的运营商PEP 505

【讨论】:

  • OP 专门询问了检查a 的真实性,而不是检查a is not None
  • @CrazyChucky 嗯,我可能混淆了 elvis 运算符和 null-coalescing 运算符之间的区别。不过,我会将这个答案留给可能有同样困惑的其他人。
  • 好点,我认为值得指出。或许要特别提一下 Elvis 和 null-coalescing 操作符是相似的,但是有这个区别吗?
  • @CrazyChucky 已编辑。我要指出,一些语言,比如 Kotlin,使用 ?: 进行空合并,而 Wikipedia 实际上在 "elvis operator" 下有两种行为的部分,并且在示例中有 '??' 的条目也是。所以这个词并不十分明确。
【解决方案3】:

Robᵩ's answer 关于使用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() 可能有什么副作用。

【讨论】:

    【解决方案4】:
    >>> 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
    

    【讨论】:

    • 这不是 elvis 运算符所做的。您正在考虑三元运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2011-09-30
    相关资源
    最近更新 更多