在Python中是否有特纳利条件操作器?
当前回答
你可以把它分成一个<unk>子:
(falseValue, trueValue)[test]
测试需要返回真实或虚假. 它可能更安全地总是执行它如下:
(falseValue, trueValue)[test == True]
或者您可以使用内置的 bool() 来确保 Boolean 值:
(falseValue, trueValue)[bool(<expression>)]
其他回答
做事的神秘方式:
"true" if var else "false"
但是,总是有不同的方式来做一个温和的状态:
"true" and var or "false"
不幸的是,该
(falseValue, trueValue)[test]
解决方案没有短循环行为;因此,无论情况如何,FalseValue和 trueValue都被评估,这可能是低优化或甚至错误(即 trueValue和 falseValue都可能是方法,并且有副作用)。
其中一个解决方案将是
(lambda: falseValue, lambda: trueValue)[test]()
(执行延迟到获胜者知道;)),但它引入可称和不可称的对象之间的不一致性。
因此,故事正在进行 - 选择上述三个解决方案是使用至少Python 2.5(IMHO,不再是一个问题)和不倾向于“真实价值评估到虚假”错误之间的交换。
你可能经常发现
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
Vinko Vrsalovic的答案是足够好的,只有一件事:
請注意,條件是表達,而不是表達,這意味著您無法在條件表達內使用任命表達或通過或其他表達。
华鲁斯操作员在Python 3.8
在Walrus操作器在Python 3.8中引入后,有些事情发生了变化。
(a := 3) if True else (b := 5)
给 a = 3 和 b 不定义,
(a := 3) if False else (b := 5)
给 a 不定义 和 b = 5 和
c = (a := 3) if False else (b := 5)
给 c = 5, a 不定义, b = 5 。
即使这可能是丑陋的,任务可以在Python 3.8之后的条件表达中进行。
我发现默认的Python合成val = a if cond other b cumbersome,所以有时我这样做:
iif = lambda (cond, a, b): a if cond else b
# So I can then use it like:
val = iif(cond, a, b)
当然,它有一个缺点,总是评估双方(a和b),但合成对我来说更清楚。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录