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


当前回答

作为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

其他回答

有多种方式,最简单的是在“印刷”方法中使用状态。

你可以使用

print("Twenty" if number == 20 else "Not twenty")

相当于:

if number == 20:
    print("Twenty")
else:
    print("Not twenty")

因此,可以打印超过两份声明,例如:

if number == 20:
    print("Twenty")
elif number < 20:
    print("Lesser")
elif 30 > number > 20:
    print("Between")
else:
    print("Greater")

可以写作如:

print("Twenty" if number == 20 else "Lesser" if number < 20 else "Between" if 30 > number > 20 else "Greater")

其他答案是正确的谈论Python操作员. 我想补充提到一个场景,操作员经常使用,但有一个更好的字符。

假设我们希望使用选项_值与默认值,如果它没有设置:

run_algorithm(option_value if option_value is not None else 10)

或者,如果选项_值从未设置为虚假值(0,“”,等),

run_algorithm(option_value if option_value else 10)

但是,在这种情况下,一个越来越好的解决方案只是写作。

run_algorithm(option_value or 10)

对于 Python 2.5 或更高版本,有一个具体的合成:

[on_true] if [cond] else [on_false]

在更老的Pythons中,一个特纳运营商没有实施,但可以模拟它。

cond and on_true or on_false

雖然有一個可能的問題,即如果 cond 評估到 True 和 on_true 評估到 False 然後 on_false 返回而不是 on_true. 如果你想要這種行為的方法是 OK,否則使用此方法:

{True: on_true, False: on_false}[cond is True] # is True, not == True

可以包装的:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

以此方式使用:

q(cond, on_true, on_false)

它与所有 Python 版本兼容。

一个提示比一个答案更多(我不需要重复显而易见的百度),但有时我用它作为一个单线缩短在这样的结构:

if conditionX:
    print('yes')
else:
    print('nah')

它变成:

print('yes') if conditionX else print('nah')

有些(很多)可能在它上被称为无神论(甚至,Ruby-ish :),但我个人觉得它更自然 - 也就是说,你会如何正常表达它,加上在大块代码中更有视觉吸引力。

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

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