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的东西,我不会羞于投入一些生产级代码:)
谢谢您的帮助 !
做所有事情的正确方法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)
实际上,我在网上查找时发现了一种非常优雅的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)
您如何看待这个?我认为它看起来很干净而且易于阅读。