在Python <2.5中做三元条件的最佳方法

Cha*_*guy 1 python ternary python-2.5

我必须承受Python版本<2.5(具体为2.4.3)

似乎三元运算符是从2.5开始在Python中引入的.对于那些不熟悉的人,Python> = 2.5中的三元运算符如下所示:

def do_ternary(flag):
    return "foo" if flag else "bar"
Run Code Online (Sandbox Code Playgroud)

我想知道一些在早期版本的Python中模拟这个的解决方案.我可以肯定用if ... else,但我正在寻找更多pythonic的东西,我不会羞于投入一些生产级代码:)

谢谢您的帮助 !

Sin*_*ion 8

做所有事情的正确方法if/else是:

(condition and (yes_value,) or (no_value,))[0]
Run Code Online (Sandbox Code Playgroud)

这既做短路也解决了何时yes_value本身就是假的问题.显然,如果你有理由避免这种污垢,那就这么做吧; 在您的示例中,两个条件都是常量表达式,因此您可以:

{True: yes_value, False: no_value}[bool(condition)]
Run Code Online (Sandbox Code Playgroud)

或更简洁:

(no_value, yes_value)[condition]
Run Code Online (Sandbox Code Playgroud)

如果你确实需要短路,但你确信yes_value永远不会是假的,你可以删除元组:

 condition and yes_value or no_value
Run Code Online (Sandbox Code Playgroud)

但这可能只有在yes_value实际上是一个常数时才有效.如果这些都不符合您的口味或需求,只需使用if:带有中间变量的普通语句

if condition:
    result = yes_value
else:
    result = no_value
Run Code Online (Sandbox Code Playgroud)


Cha*_*guy 5

实际上,我在网上查找时发现了一种非常优雅的pythonic解决方案:

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
Run Code Online (Sandbox Code Playgroud)

您如何看待这个?我认为它看起来很干净而且易于阅读。