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


当前回答

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

>>> 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 是一个合成丰富的语言,有很多愚蠢的技巧,不立即显而易见的破坏者。

其他回答

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

[expression] and [on_true] or [on_false]

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

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

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

在Python中,Ternary Operator的合成是:

假如他是真實的,

使用这个合成,这里是我们如何使用Python的Ternary操作器重写上面的代码:

game_type = 'home'
shirt = 'white' if game_type == 'home' else 'green'

请注意,表达式可能是任何类型的表达式,包括函数呼叫,返回值,评估为真实或虚假。

是的,Python有一个特纳运营商,这里是合成和一个示例代码来展示相同的:)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false

a = input("Enter the First Number ")
b = input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")

正如我已经回答过的那样,是的,在Python中有一个特纳里操作员:

<expression 1> if <condition> else <expression 2>

在许多情况下, < 表达 1> 也被用作 Boolean 评估的 < 条件>. 然后您可以使用短循环评估。

a = 0
b = 1

# Instead of this:
x = a if a else b
# Evaluates as 'a if bool(a) else b'

# You could use short-circuit evaluation:
x = a or b

短循环评估的一个大专业是链接超过两个表达式的可能性:

x = a or b or c or d or e

当与功能工作时,它在细节上更不同:

# Evaluating functions:
def foo(x):
    print('foo executed')
    return x


def bar(y):
    print('bar executed')
    return y


def blubb(z):
    print('blubb executed')
    return z


# Ternary Operator expression 1 equals to False
print(foo(0) if foo(0) else bar(1))
''' foo and bar are executed once
foo executed
bar executed
1
'''

# Ternary Operator expression 1 equals to True
print(foo(2) if foo(2) else bar(3))
''' foo is executed twice!
foo executed
foo executed
2
'''

# Short-circuit evaluation second equals to True
print(foo(0) or bar(1) or blubb(2))
''' blubb is not executed
foo executed
bar executed
1
'''

# Short-circuit evaluation third equals to True
print(foo(0) or bar(0) or blubb(2))
'''
foo executed
bar executed
blubb executed
2
'''

# Short-circuit evaluation all equal to False
print(foo(0) or bar(0) or blubb(0))
''' Result is 0 (from blubb(0)) because no value equals to True
foo executed
bar executed
blubb executed
0
'''

PS:当然,一个短循环评估不是一个电路运营商,但经常在短循环足够的情况下使用电路,它具有更好的可读性,可以连锁。

连接多个运营商的方式:

f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal