在Python中是否有特纳利条件操作器?
当前回答
我发现默认的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),但合成对我来说更清楚。
其他回答
对于 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 版本兼容。
很常见需要根据一个条件将一个值或另一个值分配给一个变量。
>>> 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 是一个合成丰富的语言,有很多愚蠢的技巧,不立即显而易见的破坏者。
不同编程语言的Ternary Operator
在这里,我只是试图在编程语言中显示一些重要的区别。
Ternary Operator 在 JavaScript 中
var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0
土木运营商在卢比
a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0
Ternary 运营商在 Scala
val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0
R 编程中的 Ternary 操作员
a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0
在Python中使用Ternary Operator
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
其他答案是正确的谈论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中有一个特纳里操作员:
<expression 1> if <condition> else <expression 2>
在许多情况下, < 表达 1> 也被用作 Boolean 评估的 < 条件>. 然后您可以使用短循环评估。
a = 0
b = 1
# Instead of this:
x = a if a else b
# Evaluates as 'a if bool(a) else b'
# You could use short-circuit evaluation:
x = a or b
短循环评估的一个大专业是链接超过两个表达式的可能性:
x = a or b or c or d or e
当与功能工作时,它在细节上更不同:
# Evaluating functions:
def foo(x):
print('foo executed')
return x
def bar(y):
print('bar executed')
return y
def blubb(z):
print('blubb executed')
return z
# Ternary Operator expression 1 equals to False
print(foo(0) if foo(0) else bar(1))
''' foo and bar are executed once
foo executed
bar executed
1
'''
# Ternary Operator expression 1 equals to True
print(foo(2) if foo(2) else bar(3))
''' foo is executed twice!
foo executed
foo executed
2
'''
# Short-circuit evaluation second equals to True
print(foo(0) or bar(1) or blubb(2))
''' blubb is not executed
foo executed
bar executed
1
'''
# Short-circuit evaluation third equals to True
print(foo(0) or bar(0) or blubb(2))
'''
foo executed
bar executed
blubb executed
2
'''
# Short-circuit evaluation all equal to False
print(foo(0) or bar(0) or blubb(0))
''' Result is 0 (from blubb(0)) because no value equals to True
foo executed
bar executed
blubb executed
0
'''
PS:当然,一个短循环评估不是一个电路运营商,但经常在短循环足够的情况下使用电路,它具有更好的可读性,可以连锁。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用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中获得所有直接子目录