如果变量为真,则最有效/ pythonic方式来预先添加字符串

时间:2015-04-28 15:39:34

标签: python

我在几个地方都有类似以下的代码:

if myvar:
    thestr = "Extra text"
else:
    thestr = "text"

我已经考虑通过将代码更改为以下内容来缩短代码:

thestr = "%stext" % "Extra " if myvar else ""

由于它以任何方式执行if / else,我怀疑第二种方法较慢,因为它还必须进行字符串连接。但是,代码更短,这很好。并更改为" text"只需要改变一次。

最好的方法是什么?任何其他推荐的方式都可以。

4 个答案:

答案 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)]

否则,第一种方法具有清晰度值