shell中join链接多个域_不要在Python中使用"+"来连接字符串

作者 | Christopher Tao
译者 | IT外文选刊

比较在Python中用"+"和join()方法连接字符串。

当我开始使用Python时,很直观、很容易就想到使用加法运算符+来连接字符串,就像很多编程语言如Java一样。

然而,很快我就意识到,很多开发者似乎都喜欢用.join()方法而不是+。在这篇文章中,我将介绍这两种方法的区别是什么,以及为什么你不应该使用+。

开始

8cf9ce43a9c77b3bbd7e4ae243f3240f.png
来自Dayne Topkin在Unsplash上的照片

作为一个初学者,或者是刚刚从其他语言中转过来的人,用+来连接字符串,写出这样的代码是非常容易的:

str1 = "I love "
str2 = "Python."
print(str1 + str2)

4feadfa284ced0be8c31d5ce3e4aa81d.png

随着你对Python的使用越来越多,你可能会意识到别人更喜欢使用像这样的join()方法:

str1 = "I love "
str2 = "Python."
print(''.join([str1, str2]))

4a6a6a578e2da4535b12e6a836d38cd4.png

说实话,当我第一次看到上面的方法的时候,我就在想,这个方法不直观,看起来有点难看。

Join多个字符串

3158830eac13b436b2535df47ceb894a.png
来自Tim Boote在Unsplash上的照片

尽管如此,有一次我需要在一个列表中加入多个字符串。

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']

最初,我是这样做的:

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']
def join_strs(strs):
    result = ''
    for s in strs:
        result += ' ' + s
    return result[1:]
join_strs(strs)

9e9cc6cee4d6198bbd2ae7bac5fd3759.png

在这个例子中,我需要写一个for循环来逐一连接字符串。另外,最终result字符串需要去掉我在开始的时候加的一个空白符,因为所有的字符串都需要在前面加一个空白符号,但是第一个字符串不需要。你可能会有其他的解决办法,比如在for循环中添加一个索引,让index=0处的字符串不应该加这个留白。总之,你还是会需要这个for循环,并对这些空白做一些处理。

写完之后,我想起来以前见过.join()方法,也许这个时候就需要用到这个方法了!

ffc423cbe352a4b9adebfdc184767244.png

多么简单啊!一行代码就能完成一切。因为.join()方法是由一个字符串对象调用的,所以这个字符串对象将被用来连接列表中的每一个字符串,所以你不需要担心开头的空格。

但是,等等,你真的认为这就是我们需要使用join()方法而不是+的唯一原因吗?不,请阅读下一节。

join()方法背后的逻辑

8c3738a88ca1834ac050c46bc69bf9d5.png
来自Michael Dziedzic在Unsplash上的照片

现在,我们来比较一下这两种方法的性能。我们可以用Jupyter Notebook的神奇方法%timeit来测评它们。

40bb19b183f2055ede6743a5a948b2a4.png

上图中的性能是基于100k的轨迹,所以结果非常有把握,也很明显。使用join()方法可以比使用+来连接列表中的字符串快4倍。

为什么会这样?

下面是我画的一个概念图,用来演示用+连接字符串的方法。

939f93fdd538df210232aa4762e7bdbe.png
使用+运算符和for循环来连接列表中的字符串

这显示了for循环和+运算符的作用:

  1. 对于每次循环,从列表中找到字符串
  2. Python 执行器解释表达式 result += ‘ ‘+ s,并为’ ‘空白字符申请内存地址
  3. 然后,执行器意识到空白字符需要用一个字符串连接,所以它将为字符串 s 申请内存地址,这就是第一个循环的生命周期
  4. 对于每一次循环,执行器需要申请两次内存地址,一次为空白字符,另一次为字符串
  5. 总共有12次内存分配

然而,Join()方法是怎么回事?

638291ad6359b2048b4d9d2108d472f9.png
使用 “join() “方法连接列表中的字符串
  1. 执行者会计算出列表中的字符串有多少个——有6个。
  2. 这意味着用于连接列表中的字符串的字符串需要重复6-1=5次。
  3. 它知道需要有11个内存空间,所以会一次性全部应用,并提前分配。
  4. 把这些字符串按顺序放好,返回结果。

所以,很明显,主要的区别在于内存分配的次数,是性能提升的主要原因。

试想一下,如果用join()方法把6个字符串连接在一起,速度已经快了4倍。如果我们在连接数量非常多的字符串呢?那就会有更大的差别!

总结

c3ba37ea2c4cbfb1d194ec435ef914f8.png
来自Liam Briese在Unsplash上的照片

在这篇短文中,我比较了在Python中连接字符串时+操作符和join()方法的区别。显然,由于其性能的原因,人们更倾向于使用join()方法。

学习一门编程语言通常是一条漫长的道路,但Python对于初学者来说,它的学习时间相对较短,这绝对是非常棒的。当我们入门,开始使用Python之后,我们不应该止步于此,满足于能用Python做什么就用什么。通常情况下,高手和普通的开发者的区别就来自于细节方面的知识。

让我们继续寻找更多的Python技巧,让自己离Python大师更近一步!

外文链接:

https://towardsdatascience.com/do-not-use-to-join-strings-in-python-f89908307273​towardsdatascience.com

版权声明:

本译文仅用于学习、研究和交流目的,欢迎非商业转载。转载请注明出处、译者和IT外文选刊的完整链接。

更多优质IT外文在“IT外文选刊”(公众号)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值