equivalent of `a?b:c`

52

如何更简单地实现这个逻辑?

if isfemale_bit:
    print('F')
else:
    print('M')

目前最好的选择是 print(['M', 'F'][int(isfemale_bit)])。 是否有更好的替代方案?


1
不,你需要最清晰、最明显、最易于维护的代码。为什么要模拟一个几乎比混淆机制更糟糕的运算符呢? - Nicholas Knight
1
我喜欢你的原始解决方案,但 ('M','F') [int(isfemale_bit)] 是最佳版本。像你这样巧妙的解决方案应该受到赞赏。 - freegnu
3
@freegnu说错了,你应该在任何时候都选择清晰而不是巧妙的技巧。 - Katriel
4
也许你可以花点时间解释一下上述陈述中哪一部分不清楚。它易于阅读,简练地执行了所需的操作,并且是有效的Python代码。也许我理解有误。我总是愿意学习新东西。你能否以一个或两个例子来支持你的观点和权威立场,说明这种做法的失败之处?或者你应该把你反对简洁代码的运动带到Perl部分去,那里有更多的燃料。 - freegnu
4个回答

60

7
这相当于 b?a:c - Frank Vel
如果你指的是C/C++表达式,那么是的。 - HelloGoodbye
@HelloGoodbye 这个问题的标题询问了 a?b:c 的等效写法,应该是 b if a else c。这个答案中的顺序有所不同。 - Frank Vel
1
@FrankVel 抱歉,我有点匆忙地阅读了您的评论;我以为那是一个问题。好观点,它并不等同于问题标题中的表达! - HelloGoodbye

17
啊,三元运算符:
>>> print 'foo' if True else 'bar'
foo
>>> print 'foo' if False else 'bar'
bar

15
 print 'F' if isfemale_bit else 'M'

9

我猜您正在寻找类似于C代码中的isfemale_bit?'F':'M'的解决方案。

您可以使用and-or构造(参见《Dive Into Python》)。

print isfemale_bit and 'F' or 'M'


如果 and 评估为 true,则返回其第二个参数;or 返回其最后一个 truthy 参数。你可以结合这些属性来获得三元运算符的等效形式。有点难以阅读,但它能够工作。 - Paul Rosania
4
我了解它的运作方式,但我不明白为什么你会这样做。 - senderle
在你对Python的真正语法进行嘲笑之前,先学会用整个语言去思考。在Python中使用冗长的语句只会显示出程序员的经验不足,也就是说你还没有开始用Python进行思考。 - freegnu
@freegnu,我并不是嘲笑任何语法 - 我是在嘲笑一个使用案例。你是在说三元运算符很啰嗦吗?你是在说这是更好的选择吗?不过,我会撤回我的挖苦问号 - 我有点无礼了 - 抱歉! :) - senderle
2
这在 Python 引入三元操作符之前很常见(它相对较新),但现在不再有太多意义。如果你想让三元操作符返回假值,如果将其视为三元操作符,则会以非常难以调试的方式中断。这也比真正的三元操作符更难阅读。我强烈建议不要使用它。 - Aaron Dufour
说实话,当语言不断发展时,你会怎么做?把头埋在地里说新的语言元素不清楚是没有帮助的。权威地说新的语言元素不清楚、令人困惑或不安全,这样做既荒谬又无聊。我建议你学习新的语言元素,停止要求别人忽略和回避你可能不知道的完全有效、安全、经过测试和清晰可理解的语言部分。 - freegnu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接