如果Python没有三元条件运算符,是否可以使用其他语言结构模拟一个?
如果Python没有三元条件运算符,是否可以使用其他语言结构模拟一个?
是的 添加 在2.5版本中。
语法是:
a if condition else b
第一 condition
然后进行评估 a
要么 b
基于的返回 布尔 的价值 condition
如果 condition
评估为 真正 a
返回,否则 b
被退回。
例如:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
请注意,条件是一个 表达不是 声明。这意味着您不能使用作业或 pass
或有条件的其他陈述:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
在这种情况下,你必须使用正常 if
声明而不是条件。
请记住,由于以下几个原因,一些Pythonist对此不满意:
如果您在记住订单时遇到问题,请记住,如果您大声朗读它,您(几乎)会说出您的意思。例如, x = 4 if b > 8 else 9
被大声朗读为 x will be 4 if b is greater than 8 otherwise 9
。
官方文件:
您可以索引到元组:
(falseValue, trueValue)[test]
test
需要回归 真正 要么 假。
总是将它实现为以下可能更安全:
(falseValue, trueValue)[test == True]
(falseValue, trueValue)[bool(<expression>)]
对于2.5之前的版本,有诀窍:
[expression] and [on_true] or [on_false]
它可能会给出错误的结果 on_true
具有错误的布尔值。1
虽然它确实有从左到右评估表达式的好处,但在我看来更清楚。
表达式 如果 条件 其他 表达式2
>>> a = 1
>>> b = 2
>>> 1 if a > b else -1
-1
>>> 1 if a > b else -1 if a < b else 0
-1
从 文件:
条件表达式(有时称为“三元运算符”)具有所有Python操作的最低优先级。
表达方式
x if C else y
首先评估条件, C (不是x);如果 C 是真的, X 被评估并返回其值;除此以外, ÿ 被评估并返回其值。看到 PEP 308 有关条件表达式的更多详细信息
自2.5版以来的新版本。
2006年添加了Python中条件表达式的运算符作为其中的一部分 Python Enhancement Proposal 308。它的形式与常见的不同 ?:
运营商,它是:
<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
和 or
运营商:
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]
解决方案没有短路行为;因此,无论条件如何,都会评估falseValue和trueValue。这可能是次优的甚至是错误的(即trueValue和falseValue都可能是方法并且具有副作用)。
对此的一个解决方案是
(lambda: falseValue, lambda: trueValue)[test]()
(执行延迟到获胜者已知;)),但它引入了可调用和不可调用对象之间的不一致。此外,它不能解决使用属性时的情况。
故事就是这样 - 在3个提到的解决方案之间进行选择是在具有短路功能,使用至少python 2.5(恕我直言不再是问题)和不容易出现“trueValue-evaluates-to-false”之间的权衡错误。
对于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
。如果你想要这个行为,方法就没问题,否则使用这个:
{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版本兼容。
在这里,我试着展示一些重要的区别 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
Scala中的三元运算符
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
现在你可以看到蟒蛇语言的美丽。它具有高度可读性和可维护性。