【问题标题】:Using ternary if-else in python expect with and-or keywords在python中使用三元if-else和and-or关键字
【发布时间】:2021-11-23 03:55:46
【问题描述】:

我最近在这个网站上看到你可以使用语法

var = cond and value1 or value2

代替传统的三元语法

var = value1 if cond else value2

此后,我一直未能找到说它的用户或与此主题相关的任何在线文章,但在我的代码中尝试后,它似乎按预期工作。有人可以澄清一下这种语法是真的有效还是只是侥幸?

【问题讨论】:

  • 这很容易澄清:运行它!
  • 顺便说一句,在 Python 2.4 中实现了三元 if 之前,这是一种非常常见的模式。
  • 是的,这是一种非常 Pythonic 的方式来编写该表达式

标签: python conditional-operator


【解决方案1】:

它并不总是有效。例如,

True and False or None

返回无,而

False if True else None

返回 False。

我建议阅读boolean operators 上的语言规范,上面写着:

表达式 x 和 y 首先计算 x;如果 x 为假,则返回其值;否则,计算 y 并返回结果值。

表达式 x 或 y 首先计算 x;如果 x 为真,则返回其值;否则,计算 y 并返回结果值。

请注意,and 或 or 都不会限制它们返回的值和类型为 False 和 True,而是返回最后评估的参数。这有时很有用,例如,如果 s 是一个字符串,如果它是空的,则应该将其替换为默认值,则表达式 s or 'foo' 会产生所需的值。

【讨论】:

  • 真;这是更喜欢三元的另一个原因,因为这种行为可能会让人出局。不过,我确实喜欢使用or 的返回值。
  • 几分钟前我写了类似print("name =", name or '(unknown)') 的东西。 :)
【解决方案2】:

这是侥幸吗?

没有。如您所见,它有效。它之所以有效,是因为返回值 a and bb 如果为真,或 False

什么时候使用

现在我们有了三进制,x = a and b or cx = b if a else c 一样长或短,而且,我声称,更难阅读。但是 this 更短:

def x(mut = None):
    mut = mut or {}

而且比可怕的更简单:

def x(mut = None):
    mut = mut if mut else {}

并且仍然比:

def x(mut=None):
    if not mut:
        mut = {}

这会在函数的开头放置几行缩进的短行只是我的眼睛不想要它们。

请注意,在这种情况下,我们使用(并行)事实,即or 返回第一个真正的元素或False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2015-09-29
    相关资源
    最近更新 更多