7

如何将表达式写得更短:

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

或者

if float_var:
    return formatted_string
else:
    return None

谢谢!

4

5 回答 5

32

这个表达<value> if <condition> else <other_value>方式已经很惯用了——当然比其他例子更习惯,并且在<value>简单的时候可能是首选。这是 Python 的三元运算符,所以如果你正在寻找类似 的东西<condition> ? <value> : <other_value>,那是不存在的。

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

于 2010-03-27T14:06:30.790 回答
6

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

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

当我第一次看到它时,我读到它

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

这很愚蠢。我不得不试一试以确保它的工作方式。

顺便说一句,您的第一个示例不等于您的第二个示例

if float_var:
    return formatted_string
else:
    return None

这将始终返回格式化字符串或无。你的第一个例子如果你传入任何评估为 False (False, 0, 0.0, "", [] 等) 将返回不变,所以你的返回类型可以是字符串、布尔值、列表、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

通过将它们转换为浮点数,这将适用于其他整数(和长整数)。

于 2010-03-27T14:29:08.507 回答
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有人可能会建议滥用for this的短路行为。但是,这会使代码更难阅读,并且不允许您指定介于None和其他错误值之间,这通常会导致错误。
于 2010-03-27T17:28:59.387 回答
1

如果您正在使用 are already using v if c else u,那么您已经在使用最易读和最有效的三元运算符。

还有其他方法,但它们在可读性方面受到影响。

于 2010-03-27T14:08:23.237 回答
0
float_var and "%.0f" % float_vav

是不是很棒?

于 2010-03-27T18:51:35.953 回答