我在几个地方都有类似以下的代码:
if myvar:
thestr = "Extra text"
else:
thestr = "text"
我已经考虑通过将代码更改为以下内容来缩短代码:
thestr = "%stext" % "Extra " if myvar else ""
由于它以任何方式执行if / else,我怀疑第二种方法较慢,因为它还必须进行字符串连接。但是,代码更短,这很好。并更改为" text"只需要改变一次。
最好的方法是什么?任何其他推荐的方式都可以。
答案 0 :(得分:2)
使用三元组是代码中最短的。串联很快,所以不是一个问题。可读性和错误是,你确实犯了错误。
您需要更明确地了解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 "???",
}
答案 1 :(得分:2)
在这里看不到明显的速度差异(按时间的升序排序):
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
答案 2 :(得分:0)
我认为多行上的if / else是我通常编码的方式。但我高度重视清晰度/显而易见性,它是最清晰/最明显的解决方案,imo。此外,我现在通常只使用+
运算符进行字符串连接,并且更喜欢使用printf样式的%
替换。因此,我这样做:
if myvar:
theStr = 'Extra ' + 'text'
else:
theStr = 'text'
或类似的。如果你愿意,你可以很容易地摆脱其他条件:
theStr = 'text'
if myvar:
theStr = 'Extra ' + theStr
答案 3 :(得分:0)
这主要是一个基于意见的问题,但如果myvar
是布尔
text = ["text","Extra text"]
thestr = text[myvar]
这避免了你的任何一种方法的“if ... else”,但有些模糊不清。
如果myvar
不是布尔值,您可以使用
text = ["text","Extra text"]
thestr = text[bool(myvar)]
或者,正如马克所说
text = ["text","Extra text"][bool(myvar)]
否则,第一种方法具有清晰度值