在Python中是否有特纳利条件操作器?


当前回答

你可以这样做:

[condition] and [expression_1] or [expression_2];

例子:

print(number%2 and "odd" or "even")


注: 0, 没有, 虚假, 虚假, 和 emptyString 被评为 虚假。

除0以外的任何数据都被评为真实。

如果我们“和”与0(零)的东西,结果将永远是虚假的。

0 and exp

表达式 exp 将不会被评估,因为“和”与 0 将始终被评估为零,并且不需要评估表达式。

1 or exp

exp 表达式将不会被评估,因为“或”与 1 将永远是 1. 所以不会打扰评估 exp 表达式,因为结果将是 1 无论如何(计算机优化方法)。

但是,如果

True and exp1 or exp2

同样在

False and exp1 or exp2

exp1 表达式不会被评估,因为 False 相当于 0 写作,并且与 0 做“和”将是 0 本身,但在 exp1 使用“或”之后,它将评估 exp2 表达式后“或”。


[condition] and ([expression_1] or 1) or [expression_2];

其他回答

很常见需要根据一个条件将一个值或另一个值分配给一个变量。

>>> li1 = None
>>> li2 = [1, 2, 3]
>>>
>>> if li1:
...     a = li1
... else:
...     a = li2
...
>>> a
[1, 2, 3]

下面是<unk>形状,但这不是最简短的方式 - 见最后一个例子。

>>> a = li1 if li1 else li2
>>>
>>> a
[1, 2, 3]
>>>

>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>

上述工作,因为 li1 是 无 和 翻译者 将其视为 逻辑表达中的虚假 然后 翻译者 移动并评估第二个表达,这不是 无 和 它不是一个空白的列表 - 因此,它被归咎于 a。

这也适用于空白列表,例如,如果你想分配一个任何列表都有项目。

>>> li1 = []
>>> li2 = [1, 2, 3]
>>>
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>

>>> s1 = ''
>>> s2 = 'hello world'
>>>
>>> a = s1 or s2
>>>
>>> a
'hello world'
>>>

我明白,有些人可能会说这不是一个很好的风格选择,因为它依赖于机械,不立即显而易见的所有开发人员. 我个人不同意这个观点. Python 是一个合成丰富的语言,有很多愚蠢的技巧,不立即显而易见的破坏者。

不同编程语言的Ternary Operator

在这里,我只是试图在编程语言中显示一些重要的区别。

Ternary Operator 在 JavaScript 中

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

土木运营商在卢比

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Ternary 运营商在 Scala

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

R 编程中的 Ternary 操作员

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

在Python中使用Ternary Operator

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

在 2.5 之前的版本中,有以下技巧:

[expression] and [on_true] or [on_false]

它可以提供错误的结果,当 on_true 具有虚假的 Boolean 值。

雖然它有評估表達的好處留在右邊,這在我看來更清楚。

是否有“C”的“?”:“特纳利运营商的同等值?

从文档中:

条件表达式(有时称为“永久运营商”)具有所有 Python 操作的最低优先事项. 表达式 x 如果 C 其他 y 首先评估条件, C (不是 x); 如果 C 是真实的, x 被评估并返回值; 否则, y 被评估并返回值。

此分類上一篇: 最新版本 2.5.

作为Python Enhancement Proposal 308的一部分,2006年在Python中添加了一个条件表达的操作员,其形式不同于常见的?:操作员,它看起来如下:

<expression1> if <condition> else <expression2>

相当于:

if <condition>: <expression1> else: <expression2>

下面是一个例子:

result = x if a > b else y

可使用的另一个合成(可与 2.5 之前的版本兼容):

result = (lambda:y, lambda:x)[a > b]()

工人被精心评估。

另一种方式是通过索引一个<unk>(不符合大多数其他语言的条件运营商):

result = (y, x)[a > b]

或明确构建的词典:

result = {True: x, False: y}[a > b]

另一个(不太可靠),但更简单的方法是使用和和或运营商:

result = (a > b) and x or y

但是,如果 x 是虚假的,它就不会工作。

一个可能的工作岗位是创建 x 和 y 列表或列表如下:

result = ((a > b) and [x] or [y])[0]

或:

result = ((a > b) and (x,) or (y,))[0]

如果您正在使用字典,而不是使用一个温和的条件,您可以利用获得(关键,默认),例如:

shell = os.environ.get('SHELL', "/bin/sh")

来源:?:在维基百科的Python