Python中'...如果...否则...'表达式的惯用法
如何让这个表达式写得更简洁:
return '%.0f' % float_var if float_var else float_var
或者
if float_var:
return formatted_string
else:
return None
谢谢!
5 个回答
你想要做的事情不太清楚。
最直接的理解是这样工作的:
>>> 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
但我几乎可以肯定你并不想要这个。
我猜你是想用"
if float_var
"来检查是否为None
?如果是这样,你应该写成"if foo is not None
",而不是"if foo
",前者更清晰,也更不容易出错。如果这确实是你的意思,我建议你重新考虑你的模型。不断返回
None
会传播错误,这是不好的:这样做不仅难看,还容易出错,不符合常规。可以使用异常来处理。
简短并不总是更好。你的代码片段并不特别长或难以处理。实际上,如果你想避免潜在的错误,可能需要让它们稍微长一些。
- 有人可能会建议滥用
or
的短路特性来实现这个。但这样会让代码更难读,而且无法区分None
和其他假值,这常常会导致错误。
- 有人可能会建议滥用
我会用括号来让这个表达式更容易理解:
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
这样可以处理其他整数(和长整型),并把它们转换成浮点数。
这个表达式 <value> if <condition> else <other_value>
在Python中是很常见的用法,尤其是当 <value>
比较简单的时候,通常会更喜欢用这个写法。它是Python的三元运算符,如果你在找类似于 <condition> ? <value> : <other_value>
这样的写法,其实Python是没有的。
如果计算 <value>
或 <other_value>
需要几个步骤,那就用更长的 if: ... else: ...
这种写法。