Python .join 或字符串拼接
我明白如果你有一个可迭代的对象,应该总是使用 .join(iterable)
,而不是用 for x in y: str += x
这种方式。但是如果只有固定数量的变量,并且这些变量不在可迭代对象里,使用 .join()
还是推荐的方法吗?
比如我有
user = 'username'
host = 'host'
我应该这样做
ret = user + '@' + host
还是这样
ret = '@'.join([user, host])
我并不是从性能的角度来问这个问题,因为这两种方式的性能差别都很小。但我看到有人说总是使用 .join()
,我想知道这样做是否有特别的原因,还是说一般来说使用 .join()
是个好主意。
6 个回答
(我觉得那些指责字符串格式化的人完全没理解问题所在。)
通过构建一个数组然后把它连接成一个字符串,主要是为了提高性能。除非你真的需要这种性能,或者这种方式恰好是实现它的自然方法,否则这样做没有比简单的字符串拼接更好的地方。
说 '@'.join([user, host])
这种写法其实不太直观。这让我想知道:他为什么要这么做呢?有没有什么特别的地方?是否有可能出现多个'@'的情况?答案当然是否定的,但要得出这个结论的时间比用更自然的方式写要长。
不要为了避免字符串拼接而让你的代码变得复杂;字符串拼接本身没有什么问题。连接数组只是一个优化手段。
我理解这个问题是问:“这样做可以吗?”
ret = user + '@' + host
..答案是可以的。这完全没问题。
当然,你应该知道在Python中可以做的一些很酷的格式化操作,也要知道对于长列表来说,使用“join”方法更合适。但对于像这样的简单情况,你现在的做法完全正确。它简单明了,性能方面也不会有问题。
如果你要创建这样的字符串,通常你会想用字符串格式化的方法:
>>> user = 'username'
>>> host = 'host'
>>> '%s@%s' % (user, host)
'username@host'
Python 2.6 还增加了一种新的方式,这种方式不依赖于运算符重载,并且有一些额外的功能:
>>> '{0}@{1}'.format(user, host)
'username@host'
一般来说,大多数人只会在直接添加两个字符串的时候使用 +
。如果要处理更多的部分或者更复杂的字符串,他们通常会使用像上面那样的字符串格式化,或者把元素放在一个列表里,然后把它们连接起来(特别是当涉及到循环的时候)。使用 str.join()
的原因是,直接把字符串加在一起意味着每次都要创建一个新的字符串(并可能销毁旧的字符串) 每次添加时。虽然 Python 有时可以优化这个过程,但 str.join()
通常会更清晰、更明显,而且速度明显更快。