【问题标题】:Python's equivalent to PHP's null coalesce operator and shorthand ternary operator?Python 相当于 PHP 的 null 合并运算符和速记三元运算符?
【发布时间】:2017-07-12 17:35:01
【问题描述】:

我一直在寻找,但找不到任何东西:https://docs.python.org/3/library/operator.html

两个派上用场的 PHP 示例:

echo $count ?: 10; //prints $count if $count is not empty string, null, false or 0, otherwise prints 10.

echo $a ?? $b ?? 7; //prints $a if $a is defined and not null, otherwise will print $b, otherwise 7

Python 中有等价的运算符吗?注意:

a if condition else b

并没有真正取代速记三元运算符,因为在速记版本的 PHP 中,条件和返回值是在一个元素中指定的。

【问题讨论】:

  • a or b 如果a 为真,则计算为a,否则为b。不完全相同,但在许多情况下有效。
  • @Toskan:要求一些适用于未定义变量的东西......这不会发生。在 Python 中,使用未定义的变量会引发异常。如果你想避免这种情况,不知何故,你将需要编写一堆样板文件。或者你可以将你的变量初始化为None
  • @Toskan:这在其他语言中也是一个错误——尝试在 C#、Swift 或 Kotlin 中使用 null 合并运算符,你会发现它根本不适用于未定义的变量。 Python 的工作方式相同,它的设计初衷不是为了让未定义变量的处理变得容易,如果您想要一个空值,请使用 None 而不是 undefined。
  • 如果我在这里完全诚实,Python 似乎在做你想做的事情方面做得很好(使用 .get() 或其他),但你的主要抱怨似乎是因为 Python 的工作方式与 PHP 不同,这并不是一个真正可行的投诉。

标签: python python-3.x


【解决方案1】:

or 运算符返回第一个真值。

a = 0
b = None
c = 'yep'

print(a or 'nope')
print(b or 'nope')
print(c or 'nope')
print(b or c or 'nope')
> nope
> nope
> yep
> yep

【讨论】:

  • @Toskan:是的。如果a 未定义,则True or a 仍然是True。但是在 Python 中使用未定义的变量并不是很习惯,所以你会在其他地方遇到问题。
  • 这可能更好。即使有例外。无论如何,这在php中不是一件常见的事情或一件好事。但是,在不同的工作流程中重用模板时,您不希望重构对模板本身的所有调用。那我猜 or 运算符会派上用场
  • 其实没有,在这种情况下 undefined 仍然会抛出错误。这将使您强制检查 a 是否存在,如果不存在,则将其设置为 None 。浪费时间,我考虑手持编程语言......除非我忽略了一些东西
【解决方案2】:

在 Python 中有一种方法可以进行三元运算:

print((b, a)[a])  # if a: prints a; otherwise prints b

说明

选项在一个元组中:(b, a) [条件] 将确定我们调用排名为 0 的元素(条件为假)或元组中的 1(条件为真)。

示例

a = False
b = "youpi"
print((b, a)[a])
# youpi

condition = "Thirsty"
print(("Foo" , "Bar")[condition == "Thirsty"])
# Bar

【讨论】:

  • 你能举个简单的例子吗?一个完整的!以字符串为例
  • 这比a if a else b 略短,可读性低十倍;特别是,你必须重复a(这可能是一个复杂的表达式)
  • @tobias_k 它缩短了 69% (9/13*100),所以是的,它在可读性方面有所下降。此外,我不明白你关于重复 a 的观点,不是吗?
  • 如果 ab 都只有一个字符长,则它会缩短 69%。如果它们更长,那么差异会变得更小。重复a 的重点是a 实际上可能更像stuff.calculate(db.lookup())
  • @tobias_k 你不要在a if a else b 中重复a 吗?
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2023-03-29
  • 1970-01-01
  • 2011-12-08
  • 2023-03-23
相关资源
最近更新 更多