如何缩短表达式:
return '%.0f' % float_var if float_var else float_var
或者
if float_var:
return formatted_string
else:
return None
谢谢!
表达式<value> if <condition> else <other_value>
已经相当惯用了,肯定比另一个例子更加通俗易懂,而且在<value>
简单的情况下,这种写法也可能更受欢迎。这是Python中的三元操作符,所以如果你正在寻找类似于<condition> ? <value> : <other_value>
的东西,那么Python中是没有这个的。
如果计算<value>
或<other_value>
需要进行几个步骤,则使用更长的if:... else:...
的替代方案。
我会使用括号使表达更易读:
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(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
通过将其他整数(和长整型)转换为浮点数来实现。
"%.0f" % False
会返回"0"
,这可能也不是我们想要的结果。 - Peter Hansenfloat
的类型检查总是一个警告信号。如果期望值的两个类别是数字和 None
,那么检查 is not None
比检查 isinstance(foo, float)
更有意义,因为前者仍然允许操作进行鸭子类型。 - Mike GrahamIt is not clear what exactly you want to do.
The most literal interpretation would have it work like this
>>> 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
which I am almost certain you did not want.
I guess you are wanting to check for None
with "if float_var
"? If so, you always spell it "if foo is not None
", not "if foo
", the former being clearer and less bug-prone.
If that is what you intended, I suggest you revise your model. Propagating errors by repeatedly returning None
is a bad thing: it is ugly and bug-prone and non-idiomatic. Use exceptions instead.
Shorter is not always better. Your snippets are not painfully long or unwieldly. In fact, you will want to make them a little longer if you use them to avoid a potential bug.
or
for this. However, this makes code harder to read and doesn't allow you to specify between None
and other false values, which often leads to bugs.float_var and "%.0f" % float_vav
这不是很棒吗?
f = 0.0
x = f and "%f" % f
<type 'float'>type(x)
f = 0.1
x = f and "%f" % f
<type 'str'>... 如果值为0.0,则得到一个浮点数,否则得到一个字符串。 - Kevin Littletype(x)
None
,而第一个则返回float_var
,它可能是None
、False
、0.0
或其他一些值……到底是谁给这些东西点赞的呢? - Peter Hansen