在Python<2.5中实现三元条件句的最佳方法

2024-04-25 14:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我不得不忍受Python版本<;2.5(具体细节是2.4.3)

从2.5开始,Python中似乎引入了三元运算符。对于不熟悉的人,Python>;=2.5中的三元运算符如下所示:

def do_ternary(flag):
    return "foo" if flag else "bar"

我想知道一些在早期版本的Python中模拟这种情况的解决方案。我可以肯定如果。。。否则,我正在寻找一个更像Python的东西,我不会羞于把它放在一些生产级代码上:)

谢谢你的帮助!在


Tags: ltgt版本returniffoodefbar
3条回答

一个常见的技巧是使用列表索引,因为当需要一个整数时,False/True会变成{}/1。如果测试可能是false-y或truth-y而不是boolean,那么首先要确保测试是布尔型的:

["bar", "foo"][bool(flag)]

将产生与问题中的三元值相同的输出。在

编辑:Dougal指出,这可能与三元值的行为稍有不同,因为真值和假值都将被计算,这可能有副作用。在

事实上,我在网上查找,发现了一个非常优雅的Python解决方案:

def _if(test):
    return lambda alternative: \
               lambda result: \
                   [delay(result), delay(alternative)][not not test]()

def delay(f):
    if callable(f): return f
    else: return lambda: f

>>> fact = lambda n: _if (n <= 1) (1) (lambda: n * fact(n-1))
>>> fact(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L

你觉得这个怎么样?在我看来,它看起来很干净,很容易阅读。在

正确的方法是:

(condition and (yes_value,) or (no_value,))[0]

它既能短路,又能解决yes_value本身是假的问题。显然,如果您有理由避免这种情况,那么就这样做;在您的示例中,这两个条件都是常量表达式,因此您可以:

^{pr2}$

或者更简洁:

(no_value, yes_value)[condition]

但如果你不需要的话,你就不需要了

 condition and yes_value or no_value

但这可能只有在yes_value是一个常量时才有效。如果这些都不适合您的口味或需要,只需使用一个带有中间变量的普通olif:语句

if condition:
    result = yes_value
else:
    result = no_value

相关问题 更多 >