Python中'...如果...否则...'表达式的惯用法

6 投票
5 回答
21131 浏览
提问于 2025-04-15 20:55

如何让这个表达式写得更简洁:

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

或者

if float_var:
    return formatted_string
else:
    return None

谢谢!

5 个回答

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. 我猜你是想用"if float_var"来检查是否为None?如果是这样,你应该写成"if foo is not None",而不是"if foo",前者更清晰,也更不容易出错。

      如果这确实是你的意思,我建议你重新考虑你的模型。不断返回None会传播错误,这是不好的:这样做不仅难看,还容易出错,不符合常规。可以使用异常来处理。

  • 简短并不总是更好。你的代码片段并不特别长或难以处理。实际上,如果你想避免潜在的错误,可能需要让它们稍微长一些

    • 有人可能会建议滥用or的短路特性来实现这个。但这样会让代码更难读,而且无法区分None和其他假值,这常常会导致错误。
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

这个总是会返回一个格式化的字符串或者None。如果你在第一个例子中传入任何评估为假(比如False、0、0.0、""、[]等)的东西,它会原封不动地返回这些值,所以你的返回类型可能是字符串、布尔值、列表、整数、浮点数等等。这可能不是你想要的,尤其是当0.0是float_var的一个合法值时。我会把你的代码改成:

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

另外:

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

这样可以处理其他整数(和长整型),并把它们转换成浮点数。

32

这个表达式 <value> if <condition> else <other_value> 在Python中是很常见的用法,尤其是当 <value> 比较简单的时候,通常会更喜欢用这个写法。它是Python的三元运算符,如果你在找类似于 <condition> ? <value> : <other_value> 这样的写法,其实Python是没有的。

如果计算 <value><other_value> 需要几个步骤,那就用更长的 if: ... else: ... 这种写法。

撰写回答