用于'... if ... else ...'表达式的Python习语

时间:2010-03-27 14:02:51

标签: python idioms

如何将表达式写得更短:

return '%.0f' % float_var if float_var else float_var

if float_var:
    return formatted_string
else:
    return None

谢谢!

5 个答案:

答案 0 :(得分:27)

表达式<value> if <condition> else <other_value>已经非常惯用了 - 当然比其他示例更为恰当,并且在<value>很简单的情况下可能是首选。这是Python的三元运算符,所以如果你正在寻找像<condition> ? <value> : <other_value>这样的东西,那就不存在了。

如果计算<value><other_value>需要几步,请使用较长的if: ... else: ...替代方案。

答案 1 :(得分:4)

我会使用括号使表达式更具可读性:

return ('%.0f' % float_var) if float_var else float_var

当我第一次看到它时,我将其视为

return '%.0f' % (float_var if float_var else float_var)
这将是愚蠢的。我必须尝试一下以确定它的工作方式。

BTW你的第一个例子不等同于你的第二个例子

if float_var:
    return formatted_string
else:
    return None

这将始终返回格式化字符串或None。如果你传入任何计算结果为False(False,0,0.0,“”,[]等)的第一个例子将返回不变的,所以你的返回类型可以是string,boolean,list,int,float等。这是可能不是你想要的,特别是如果0.0是float_var的合法值。我会将您的代码更改为:

return ('%.0f' % float_var) if isinstance(float_var, float) else None

或者:

try:
    return "%.0f" % float_var
except TypeError:
    return None

通过将它们转换为float来对其他整数(和long)起作用。

答案 2 :(得分:2)

  • 目前尚不清楚您想要做什么。

    1. 最直接的解释会让它像这样工作

      >>> float_var = 4.5
      >>> '%.0f' % float_var if float_var else float_var
      '5' # This is a string
      >>> float_var = 0.0
      >>> '%.0f' % float_var if float_var else float_var
      0.0 # This is a float
      

      我几乎可以肯定你不想要。

    2. 我想您想要使用“None”检查if float_var?如果是这样,你总是把它拼写为“if foo is not None”,而不是“if foo”,前者更清晰,不易出错。

      如果 是你想要的,我建议你修改你的模型。通过反复返回None来传播错误是一件坏事:它是丑陋的,容易出错和非惯用的。改为使用例外。

  • 短暂并不总是更好。你的片段不长也不痛苦。事实上,如果你使用它们来避免潜在的错误,你会想让它们更长

    • 有人可能会建议滥用or的短路行为。但是,这会使代码难以阅读,并且不允许您在None和其他错误值之间进行指定,这通常会导致错误。

答案 3 :(得分:1)

如果您正在使用v if c else u,那么您已经在使用最具可读性和效率的三元运算符。

other ways但它们的可读性受损。

答案 4 :(得分:0)

float_var and "%.0f" % float_vav

不是很棒吗?