忘了在哪里看到一个编程大师调侃,他说程序员每天做两件事,其中一件就是处理字符串。相信很多同学都会有同感。几乎所有的编程语言都将字符串列为最基本、不可或缺的数据类型。而拼接弦乐是必备技能。今天,我将和大家一起学习Python中七种字符串拼接方式。1、C语言的%方法print('%s%s'%('Hello','world'))>>>Helloworld%的格式化字符串方法继承自古老的C语言,用在许多编程语言都有类似的实现。上面例子中的%s是一个占位符,它只代表一个字符串,并不是实际拼接的内容。实际连接的内容放在单个%符号后的元组中。类似的占位符还有:%d(代表整数)、%f(代表浮点数)、%x(代表十六进制数)等等。%占位符既是这种拼接方式的特点,也是它的局限性,因为每一种占位符都有特定的含义,实际使用起来太麻烦。2.Format()拼接方式#精简版s1='你好{}!我叫{}.'.format('World','Python编程学习圈')print(s1)>>>HelloWorld!我叫Python编程学习圈#打卡版s2='你好{0}!我叫{1}.'.format('世界','Python编程学习圈')s3='你好{name1}!我叫{name2}.'.format(name1='World',name2='Python编程学习圈')print(s2)>>>HelloWorld!我叫Python编程学习圈.print(s3)>>>HelloWorld!我叫Python编程学习圈。该方法使用花括号{}作为占位符,然后在format方法中传递到实际的拼接值。不难看出其实是对%号的拼接方式的改进。这个方法是在Python2.6中引入的。在上面的例子中,简洁版的花括号里没有内容。缺点是容易把顺序弄错。签入版本主要有两种,一种是传入序列号,另一种是使用key-value的方式。实战中,我们更推荐后一种,不会乱序计算,更加直观易读。3.()类似元组的s_tuple=('Hello','','world')s_like_tuple=('Hello''''world')print(s_tuple)>>>('Hello','','world')print(s_like_tuple)>>>Helloworldtype(s_like_tuple)>>>str注意上面例子中的s_like_tuple不是元组,因为元素之间没有逗号分隔符,这些元素可以用空格分隔也可以不用空格.使用type()查看,发现是str类型。我没有找出原因。我猜可能()括号中的内容是Python优化过的。这种方法看起来很快,但是括号()中的元素要求是真正的字符串,不能混入变量,不够灵活。#多元素不支持变量str_1='Hello'str_2=(str_1'world')>>>SyntaxError:invalidsyntaxstr_3=(str_1str_1)>>>SyntaxError:invalidsyntax#但是下面这样写不会报错str_4=(str_1)4。面向对象的模板拼接fromstringimportTemplates=Template('${s1}${s2}!')print(s.safe_substitute(s1='Hello',s2='world'))>>>Helloworld!老实说,我不喜欢这个实现。一股浓浓的被面向对象思想毒害的味道。不多说了。5.常用的+号方法str_1='Helloworld!'str_2='我叫Python编程学习圈。'打印(str_1+str_2)>>>世界您好!我叫Python编程学习圈.print(str_1)>>>Helloworld!这种方法最常用,直观易懂,属于入门级实现。但是,它也有两个容易出错的地方。首先,刚接触编程的同学很容易出错。他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上面的例子中,拼接前是两个字符串,拼接后实际是三个字符串。其次,一些有经验的程序员也容易出错。他们认为当拼接数不超过3时,使用+号会比其他方法更快(ps:很多Python教程都这么建议),但这并没有任何合理依据。事实上,当连接短文字时,由于CPython中的常量折叠功能,这些文字会转换为较短的形式,例如'a'+'b'+'c'转换为'abc','hello'+'world'也会转换为'helloworld'。这种转换是在编译时完成的,运行时不会发生拼接操作,从而加快了整体的计算速度。constantfold优化有一个限制,要求拼接结果的长度不超过20。因此,当最终拼接的字符串长度不超过20时,+运算符的方法会比后文提到的join等方法,与+号的使用次数无关。6、join()拼接方法str_list=['Hello','world']str_join1=''.join(str_list)str_join2='-'.join(str_list)print(str_join1)>>>Helloworldprint(str_join2)>>>Hello-worldstr对象自带的join()方法接受一个sequence参数实现拼接。拼接时,如果元素不是字符串,需要先进行转换。可以看出,这种方式更适用于连接序列对象(如列表)中的元素,设置统一的间隔符。这种方式基本上是拼接长度超过20时的首选,但它的缺点是不适合拼接不在序列集中的元素片段。7.f-stringmethodname='world'myname='Python编程学习圈'words=f'你好{name}。我的名字是{myname}。'print(words)>>>Helloworld.我叫Python编程学习圈。f-string方法来自PEP498(LiteralStringInterpolation,文字字符串插值),从Python3.6版本开始引入。其特点是在字符串前加f标记,在字符串中间用花括号{}包裹其他字符串变量。该方法在可读性上秒杀format()方法,在处理长字符串的拼接时其速度堪比join()方法。不过,这种方法不如其他一些编程语言优雅,因为它引入了一个f标志。而其他一些编程语言可以更简洁一些,比如shell:name="world"myname="Python编程学习圈t"words="你好${name}。我叫${myname}。"echo$话>>>你好世界。我叫Python编程学习圈。综上所述,我们前面说的“字符串拼接”其实就是从结果上理解的。如果从实现原理来划分,我们可以将这些方法分为三种:格式化类:%、format()、模板拼接类:+、()、join()插值类:待处理的f-stringFor字符串列表等序列结构,使用join()方法;当拼接长度不超过20时,采用+算子方式;如果长度超过20,高版本使用f-string,低版本根据情况使用format()或者join()方法。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
