我在几个地方有类似于以下内容的代码:
if myvar:
thestr = "Extra text"
else:
thestr = "text"
我考虑过通过将其更改为以下内容来缩短代码:
thestr = "%stext" % "Extra " if myvar else ""
由于无论哪种方式都在执行 if/else,我怀疑第二种方法速度较慢,因为它还必须执行字符串连接。但是,代码更短,这很好。对"文本"的更改只需要更改一次。
最好的方法是什么?任何其他推荐的方法也可以。
这里没有看到太多明显的速度差异(按所用时间的升序排序):
In [89]: %timeit "%stext" % "Extra " if np.random.randint(-5,5)>0 else ""
1000000 loops, best of 3: 738 ns per loop
In [91]: paste
def test():
myvar = np.random.randint(-5, 5)
if myvar > 0:
thestr = "Extra text"
else:
thestr = "text"
%timeit test()
## -- End pasted text --
1000000 loops, best of 3: 853 ns per loop
In [90]: %timeit "%stext" % ("Extra " if np.random.randint(-5,5)>0 else "")
1000000 loops, best of 3: 871 ns per loop
使用三元在代码中是最短的。而且串联速度很快,所以这不是问题。可读性和错误是,你确实犯了一个错误。
您需要更明确地说明 if 大小写是什么。在您的示例中,False 布尔值将给出 " 而不是文本。您要执行此操作:
thestr = "%stext" % ("Extra " if myvar else "")
这样,您就会告诉"%stext"使用括号中包含的三元表达式格式化自身。
在我认为这种情况中,考虑到可能读错和微小错误,三元似乎不太可能值得。您可以轻松添加几行,而不会占用一堆代码。
我发现它们更好的用途是在制作字典时,我可能需要一些参数来基于条件,如果我可以一次性声明它们而不是在制作字典后有一系列 if 块,那就更容易了。
food = {
"peanuts": "delicious",
"chocolate": "tasty",
"banana": "tasty" if peeled else "eugh",
"apple": "ok",
"python": "ew" if snake else "???",
}
我认为多行上的if/else是我通常如何编码它。但我高度重视清晰度/显而易见性,这是最清晰/最明显的解决方案,imo。此外,这些天我通常只使用 +
运算符进行字符串连接,并且更喜欢它而不是您的 printf 样式%
替换。因此,我会这样做:
if myvar:
theStr = 'Extra ' + 'text'
else:
theStr = 'text'
或类似。如果你愿意,你可以很容易地摆脱else条件:
theStr = 'text'
if myvar:
theStr = 'Extra ' + theStr
这在很大程度上是一个基于意见的问题,但如果myvar
是布尔值,则会出现另一种选择
text = ["text","Extra text"]
thestr = text[myvar]
这避免了"如果...否则",但有些混淆。
如果myvar
不是布尔值,你可以用
text = ["text","Extra text"]
thestr = text[bool(myvar)]
或者,正如马克所说
text = ["text","Extra text"][bool(myvar)]
否则,第一种方法具有清晰的价值