Python是否有三元条件运算符?

如果Python没有三元条件运算符,是否可以使用其他语言结构来模拟呢?

是的,它是在2.5版本中添加的 。
语法是:

 a if condition else b 

评估第一个condition ,然后根据condition的布尔值返回ab
如果condition评估为 a则返回,否则返回b

例如:

 >>> 'true' if True else 'false' 'true' >>> 'true' if False else 'false' 'false' 

请记住,这是由一些Pythonistas皱起了几个原因:

  • 参数的顺序与许多其他语言(如C,Ruby,Java等)不同,当不熟悉Python的“令人惊讶的”行为的人使用它时(可能会颠倒顺序),这可能会导致错误。
  • 有些人认为它“笨拙”,因为它违背了正常的思想stream动(首先考虑条件,然后考虑效果)。
  • 文体的原因。

如果您在记忆顺序方面遇到困难,请记住,如果您大声朗读,几乎可以说出您的意思。 例如, x = 4 if b > 8 else 9 ,则x = 4 if b > 8 else 9被大声朗读, x will be 4 if b is greater than 8 otherwise 9

官方文件:

  • 条件expression式
  • 是否有C的“?:”三元运算符?

您可以索引到一个元组:

 (falseValue, trueValue)[test] 

test需要返回TrueFalse
始终将其实施为:

 (falseValue, trueValue)[test == True] 

或者您可以使用内置的bool()来确保一个布尔值:

 (falseValue, trueValue)[bool(<expression>)] 

对于2.5之前的版本,有一个诀窍:

 [expression] and [on_true] or [on_false] 

on_true具有假布尔值时,它可能会给出错误的结果。 1
虽然它确实有评估expression从左到右的好处,这在我看来是更清楚的。

1. 是否有相当于C的“?:”三元运算符?

expression1 if condition else expression2

 >>> a = 1 >>> b = 2 >>> 1 if a > b else -1 -1 >>> 1 if a > b else -1 if a < b else 0 -1 

从文档 :

条件expression式(有时称为“三元运算符”)具有所有Python操作的最低优先级。

expression式x if C else y首先计算条件C不是x ); 如果C为真,则评估x并返回其值; 否则, y被评估并返回它的值。

有关条件expression式的更多细节,请参阅PEP 308 。

2.5版本以来的新增function

作为Python增强build议308的一部分,2006年添加了Python中的条件expression式运算符。 它的forms不同于常见的?:运算符,它是:

 <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]() 

对操作数进行懒惰评估 。

另一种方法是通过索引一个元组(这与大多数其他语言的条件运算符不一致):

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

或明确构造的字典:

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

另一个(不太可靠),但更简单的方法是使用and和操作符:

 result = (a > b) and x or y 

然而,如果x将是False这将不起作用。

可能的解决方法是使xy列表或元组如下所示:

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

要么:

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

如果您正在使用字典,而不是使用三元条件,则可以利用get(key, default) ,例如:

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

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

@向上:

不幸的是,

 (falseValue, trueValue)[test] 

解决scheme没有短路的行为; 因此无论条件如何,都会评估falseValue和trueValue。 这可能是不理想的甚至是越野车(即trueValue和falseValue可能是方法和副作用)。

一个解决scheme是这样的

 (lambda: falseValue, lambda: trueValue)[test]() 

(延迟执行,直到获胜者被知道;)),但它引入了可调用对象和不可调用对象之间的不一致性。 另外,在使用属性时不会解决这个问题。

因此,故事就在于 – select3个解决scheme之间的权衡是短路function之间的权衡,至less使用python 2.5(恕我直言,不再是一个问题),不容易“真正的价值评估到错误”错误。

对于Python 2.5及更新版本,有一个特定的语法:

 [on_true] if [cond] else [on_false] 

在较老的Pythons中,三元运算符没有实现,但可以模拟它。

 cond and on_true or on_false 

虽然有一个潜在的问题,如果cond评估为Trueon_true评估为False则返回on_true而不是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版本兼容。

你可能经常会发现

 cond and on_true or on_false 

但是当on_true == 0时会导致问题

 >>> x = 0 >>> print x == 0 and 0 or 1 1 >>> x = 1 >>> print x == 0 and 0 or 1 1 

在那里你会期望一个正常的三元运算符这个结果

 >>> x = 0 >>> print 0 if x == 0 else 1 0 >>> x = 1 >>> print 0 if x == 0 else 1 1 

三元运算符在不同的编程语言中

在这里我只是试图展示几种编程语言之间ternary operator一些重要区别。

Javascript中的三元运算符

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

Ruby中的三元运算符

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

三元运算符在斯卡拉

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

R编程中的三元运算符

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

Python中的三元运算符

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

现在你可以看到Python语言的美丽了。 其高度可读性和可维护性。

当然,这很容易理解。

 general syntax : first_expression if bool_expression_is_true else second_expression Example: x= 3 if 3 > 2 else 4 # assigns 3 to x if the boolean expression evaluates to true or 4 if it is false 

Python是否有三元条件运算符?

是。 从语法文件 :

 test: or_test ['if' or_test 'else' test] | lambdef 

感兴趣的部分是:

 or_test ['if' or_test 'else' test] 

所以,三元条件操作的forms是:

 expression1 if expression2 else expression3 

expression3将被懒惰地评估(也就是说,只有在布尔上下文中expression2为false时才被评估)。 而且由于recursion定义,你可以无限期地链接它们(虽然它可能被认为是不好的风格)。

 expression1 if expression2 else expression3 if expression4 else expression5 # and so on 

使用说明:

请注意,每一个if必须跟随一个else 。 人们学习列表理解和生成器expression式可能会发现这是一个困难的教训 – 以下将无法正常工作,因为Python预计第三个expression式为else:

 [expression1 if expression2 for element in iterable] # ^-- need an else here 

这引发了一个SyntaxError: invalid syntax 。 所以上面是一个不完整的逻辑块(也许用户期望在假状态下没有操作),或者可能的意图是将expression2用作filter – 注意以下是合法的Python:

 [expression1 for element in iterable if expression2] 

expression2作为列表理解的filter, 并不是三元条件运算符。

另一种更窄范围的语法:

你可能会发现写下下面的内容有点痛苦:

 expression1 if expression1 else expression2 

expression1必须用上面的用法来评估两次。 它可以限制冗余,如果它只是一个局部variables。 然而,这种用例的一个普遍的和performance性的Pythonic成语是使用or是捷径行为:

 expression1 or expression2 

这在语义上是相同的。 请注意,一些风格指南可能会以清晰为理由限制这种用法 – 它的意义很小,语法很less。

模拟python三元运算符。

例如

 a, b, x, y = 1, 2, 'a greather than b', 'b greater than a' result = (lambda:y, lambda:x)[a > b]() 

输出:

 'b greater than a' 
 In [1]: a = 1 if False else 0 In [2]: a Out[2]: 0 In [3]: b = 1 if True else 0 In [4]: b Out[4]: 1 

更多的提示而不是回答(不需要重复明显的处理时间),但我有时使用它作为在这样的结构中的一个简单的捷径:

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

,变成:

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

有些(很多:)可能会把它当作unpythonic(偶,ruby-ish :)来皱眉,但是我个人觉得它更自然 – 也就是说如何正常expression它,再加上一大块代码在视觉上更吸引人。

是的,你可以这样使用它:

 is_fat = True state = "fat" if is_fat else "not fat" 

阅读更多关于三元条件运算符

你可以这样做 :-

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

例:-

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

如果数字是奇数,这将打印“奇数”,如果数字是偶数,则打印“偶数”。


结果: –如果条件为真,则执行exp_1,否则执行exp_2。

注意: – 0,None,False,emptylist,emptyString的计算结果为False。 而0以外的任何数据评估为真。

这是如何工作的:

如果条件[condition]变成“True”,那么将评估expression_1,但不评估expression_2。 如果我们“和”0(零)的东西,结果总是会被调整。所以在下面的语句中,

 0 and exp 

expression式exp将不会被完全评估,因为“and”为0将始终计算为零,并且不需要评估expression式。 这是编译器本身在所有语言中的工作原理。

 1 or exp 

expression式exp将不会被评估,因为“或”1总是1.所以不用费心去评估expression式exp,因为结果无论如何都是1。 (编译器优化方法)。

但是如果

 True and exp1 or exp2 

第二个expression式exp2将不会被计算,因为如果exp1不是false True and exp1将为True。

同样在

 False and exp1 or exp2 

expression式exp1不会被计算,因为False等于写0,而用0来做“and”本身是0,但是在exp1之后,因为使用了“or”,所以它会计算exp或exp2之后的expression式。


注意:使用“或”和“和”的这种分支只能在expression_1不具有False(或0或None或emptylist []或emptystring')的真值时使用,因为如果expression_1变成假,那么将会评估expression_2,因为exp_1和exp_2之间存在“或”。

如果您仍然希望使其适用于所有情况,无论exp_1和exp_2的真值如何,请执行以下操作:

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

是。

 >>> b = (True if 5 > 4 else False) >>> print b True 

在其他答案中有一个三元选项,但是如果你正在检查一个布尔值或None值,你也可以用“或”来模拟它:

 >>> a = False >>> b = 5 >>> a or b 5 >>> a = None >>> a or b 5