Python是否有三元条件运算符?
如果Python没有三元条件运算符,是否可以使用其他语言结构来模拟呢?
是的,它是在2.5版本中添加的 。
语法是:
a if condition else b
评估第一个condition
,然后根据condition
的布尔值返回a
或b
如果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
需要返回True或False 。
始终将其实施为:
(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
这将不起作用。
可能的解决方法是使x
和y
列表或元组如下所示:
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
评估为True
, on_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