2024-04-25 14:03:45 发布
网友
我不得不忍受Python版本<;2.5(具体细节是2.4.3)
从2.5开始,Python中似乎引入了三元运算符。对于不熟悉的人,Python>;=2.5中的三元运算符如下所示:
def do_ternary(flag): return "foo" if flag else "bar"
我想知道一些在早期版本的Python中模拟这种情况的解决方案。我可以肯定如果。。。否则,我正在寻找一个更像Python的东西,我不会羞于把它放在一些生产级代码上:)
谢谢你的帮助!在
一个常见的技巧是使用列表索引,因为当需要一个整数时,False/True会变成{}/1。如果测试可能是false-y或truth-y而不是boolean,那么首先要确保测试是布尔型的:
False
True
1
["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本身是假的问题。显然,如果您有理由避免这种情况,那么就这样做;在您的示例中,这两个条件都是常量表达式,因此您可以:
yes_value
或者更简洁:
(no_value, yes_value)[condition]
但如果你不需要的话,你就不需要了
condition and yes_value or no_value
但这可能只有在yes_value是一个常量时才有效。如果这些都不适合您的口味或需要,只需使用一个带有中间变量的普通olif:语句
if:
if condition: result = yes_value else: result = no_value
一个常见的技巧是使用列表索引,因为当需要一个整数时,}/
False
/True
会变成{1
。如果测试可能是false-y或truth-y而不是boolean,那么首先要确保测试是布尔型的:将产生与问题中的三元值相同的输出。在
编辑:Dougal指出,这可能与三元值的行为稍有不同,因为真值和假值都将被计算,这可能有副作用。在
事实上,我在网上查找,发现了一个非常优雅的Python解决方案:
你觉得这个怎么样?在我看来,它看起来很干净,很容易阅读。在
正确的方法是:
它既能短路,又能解决
^{pr2}$yes_value
本身是假的问题。显然,如果您有理由避免这种情况,那么就这样做;在您的示例中,这两个条件都是常量表达式,因此您可以:或者更简洁:
但如果你不需要的话,你就不需要了
但这可能只有在
yes_value
是一个常量时才有效。如果这些都不适合您的口味或需要,只需使用一个带有中间变量的普通olif:
语句相关问题 更多 >
编程相关推荐