Python .join或字符串连接

Fal*_*rri 23 python string-concatenation

我意识到,如果你有一个可迭代的,你应该总是使用.join(iterable)而不是for x in y: str += x.但是,如果只有固定数量的变量尚未在迭代中,.join()仍然使用推荐的方式?

比如我有

user = 'username'
host = 'host'
Run Code Online (Sandbox Code Playgroud)

我该怎么做

ret = user + '@' + host
Run Code Online (Sandbox Code Playgroud)

要么

ret = '@'.join([user, host])
Run Code Online (Sandbox Code Playgroud)

从性能的角度来看,我并没有那么多问,因为两者都是非常微不足道的.但我读到这里的人说总是使用.join(),我想知道是否有任何特殊原因,或者它通常是一个好主意使用.join().

Tho*_*ers 29

如果您正在创建类似的字符串,通常需要使用字符串格式:

>>> user = 'username'
>>> host = 'host'
>>> '%s@%s' % (user, host)
'username@host'
Run Code Online (Sandbox Code Playgroud)

Python 2.6添加了另一种形式,它不依赖于运算符重载并具有一些额外的功能:

>>> '{0}@{1}'.format(user, host)
'username@host'
Run Code Online (Sandbox Code Playgroud)

作为一般准则,大多数人+只有在字符串中添加两个字符串时才会使用字符串.对于更多部分或更复杂的字符串,它们要么使用字符串格式,如上所述,要么在列表中组合元素并将它们连接在一起(特别是如果涉及任何形式的循环.)使用的原因str.join()是将字符串添加在一起意味着创建一个每个添加的新字符串(可能会破坏旧的字符串).Python有时可以优化它,但str.join()很快就会变得更清晰,更明显,更快.

  • 值得注意的是,`%`表示法已被弃用,而`.format()`方法是*未来之路*.相关文档:http://docs.python.org/library/string.html#formatstrings (11认同)
  • `%` - 格式化操作尚未弃用.它们被认为是*过时*,但它们仍然可用于所有Python版本,尚未安排实际删除,也不会触发任何类型的警告. (2认同)
  • 顺便说一句,我觉得这更有点难过,因为字符串格式*作为运算符*是最初吸引我使用该语言的可爱的Python怪癖之一. (2认同)
  • http://docs.python.org/library/stdtypes.html:"这种字符串格式化方法是Python 3.0中的新标准,应该优先于新代码中字符串格式化操作中描述的%格式." (2认同)

Nic*_*ins 14

我接受这个问题的意思是:"这样做可以:"

ret = user + '@' + host
Run Code Online (Sandbox Code Playgroud)

..答案是肯定的.那很好.

当然,你应该知道你可以用Python做的很酷的格式化东西,你应该知道,对于长列表,"加入"是要走的路,但对于像这样的简单情况,你所拥有的是非常正确.它简单明了,性能不会成为问题.


Gle*_*ard 9

(我很确定所有指向字符串格式的人都完全错过了这个问题.)

通过构造数组并加入它来创建字符串仅出于性能原因.除非你需要这种性能,或者除非它恰好是实现它的自然方式,否则这样做没有任何好处,而不是简单的字符串连接.

'@'.join([user, host])是不直观的.这让我很奇怪:他为什么要这样做?它有什么微妙之处; 有没有可能有多个'@'的情况?当然,答案是否定的,但是得出这个结论需要花费更多的时间,而不是以自然的方式写出来.

不要仅仅为了避免字符串连接而扭曲代码; 它没有任何内在错误.加入数组只是一种优化.

  • 问题是"固定数量的变量",这是一种常见的情况,使用字符串格式 - 使用`%`或使用`str.format`-.我的回答确实解释了为什么人们选择`str.join()`.至于列表与数组,我不认为使用错误的名称是一个特别好的主意,考虑到Python*有*有数组,并且它们是完全不同的东西.(出于同样的原因,为了确保读者不要混淆,我会注意到`[] .join`不存在.) (3认同)
  • 我不确定我在回答中是如何“错过重点”的。此外,“数组”和“列表”不是一回事。 (2认同)

Mat*_*hew 8

我只是注意到,我一直倾向于使用就地连接,直到我重新阅读Python一般风格的PEP PEP-8 Python代码样式指南的一部分.

  • 代码应该以不影响Python的其他实现(PyPy,Jython,IronPython,Pyrex,Psyco等)的方式编写.例如,不要依赖CPython为a + = b或a = a + b形式的语句高效实现就地字符串连接.这些语句在Jython中运行得更慢.在库的性能敏感部分,应该使用'.join()形式.这将确保在各种实现中以线性时间进行连接.

顺便说一句,我一直在转向使用连接的做法,这样当效率更加关键时,我可以将这种习惯保留为更自动的习惯.

所以我会投票支持:

ret = '@'.join([user, host])
Run Code Online (Sandbox Code Playgroud)