如果变量为true,则以最有效的/pythonic方式预先结束字符串

如果变量为true,则以最有效的/pythonic方式预先结束字符串,python,Python,我在以下几个地方有类似的代码: if myvar: thestr = "Extra text" else: thestr = "text" 我考虑过通过将代码更改为以下内容来缩短代码: thestr = "%stext" % "Extra " if myvar else "" 由于它以if/else两种方式执行,我怀疑第二个方法速度较慢,因为它还必须执行字符串连接。但是,代码比较短,这很好。对“文本”的更改只需更改一次 最好的方法是什么?任何其他推荐的方法都可以。我认为多行上

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

if myvar:
    thestr = "Extra text"
else:
    thestr = "text"
我考虑过通过将代码更改为以下内容来缩短代码:

thestr = "%stext" % "Extra " if myvar else ""
由于它以if/else两种方式执行,我怀疑第二个方法速度较慢,因为它还必须执行字符串连接。但是,代码比较短,这很好。对“文本”的更改只需更改一次


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

我认为多行上的if/else是我通常编写代码的方式。但是我非常重视清晰性/明显性,我认为这是可能的最清晰/最明显的解决方案。而且,我现在通常只使用
+
操作符进行字符串连接,并且更喜欢使用它而不是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]
这避免了两种方法中的“if…else”,但有些模糊

如果
myvar
不是布尔值,则可以使用

text = ["text","Extra text"]
thestr = text[bool(myvar)]
或者,正如马克所说

text = ["text","Extra text"][bool(myvar)]

否则,第一种方法具有清晰的值,使用三元代码是代码中最短的。连接速度很快,所以不需要担心。可读性和错误是,你确实犯了一个错误

您需要更明确地说明if的情况。在您的示例中,假布尔值将给出“”而不是文本。您要执行以下操作:

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,你是想让一个名词成为复数吗?如果是这样的话,这是一个更为具体的问题,编写一个
pluralize()
函数将有助于解决这个问题。你的原文当然是最清楚的。您可以通过删除每个
后面的换行符将其缩短为两行。我想我应该更具体地说明我所说的最佳。我希望成为python,并确保遵循推荐的python指南。您甚至可以缩短它:
[“text”,“Extra text”][myvar]
。这让它更让人头疼。是的,只是玩玩而已。但有时这种类型的把戏实际上是“有用的”。。。我认为你的例子中的
文本应该是
“text”
是的,我认为你是对的。修好它。谢谢你的回答。我不知道我犯了什么错误。如果你复制并粘贴我写的东西,它的工作原理和我想要的完全一样,因为myvar是真是假哦,奇怪。当我运行您的代码时,我得到的只是一个空白字符串,这可能与我的Python版本有所不同?(2.7)如果评估层次结构不明确,建议使用括号,因为阅读它的人会更清楚。@SuperBiasedMan这就是为什么应该烧掉
Python
标记的原因
Python2
Python3
@mhost有很大不同:在哪种Python版本上(可能还有解释器)?(还有,你能重新检查一下吗?)我在Python2.5-3.4上试过了,结果都是空字符串。对不起,我的错误。我又试了一次,结果是错的(我之前试的时候看得太快了)。你说得对,需要括号。
 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