Python拼接字符串的7种方式详解

忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。

几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天,我跟大家一起来学习Python拼接字符串的七种方式。

1、来自C语言的%方式

print('%s %s' % ('Hello', 'world'))
>>> Hello world

%号格式化字符串的方式继承自古老的C语言,这在很多编程语言都有类似的实现。上例的%s是一个占位符,它仅代表一段字符串,并不是拼接的实际内容。实际的拼接内容在一个单独的%号后面,放在一个元组里。

类似的占位符还有:%d(代表一个整数)、%f(代表一个浮点数)、%x(代表一个16进制数),等等。%占位符既是这种拼接方式的特点,同时也是其限制,因为每种占位符都有特定意义,实际使用起来太麻烦了。

2、format()拼接方式

# 简洁版
s1 = 'Hello {}! My name is {}.'.format('World', 'Python猫')
print(s1)
>>>Hello World! My name is Python猫.

# 对号入座版
s2 = 'Hello {0}! My name is {1}.'.format('World', 'Python猫')
s3 = 'Hello {name1}! My name is {name2}.'.format(name1='World', name2='Python猫')
print(s2)
>>>Hello World! My name is Python猫.
print(s3)
>>>Hello World! My name is 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)
>>>Hello world

type(s_like_tuple) >>>str

注意,上例中s_like_tuple并不是一个元组,因为元素间没有逗号分隔符,这些元素间可以用空格间隔,也可以不要空格。使用type()查看,发现它就是一个str类型。我没查到这是啥原因,猜测或许()括号中的内容是被Python优化处理了。

这种方式看起来很快捷,但是,括号()内要求元素是真实字符串,不能混用变量,所以不够灵活。

# 多元素时,不支持有变量
str_1 = 'Hello'
str_2 = (str_1 'world')
>>> SyntaxError: invalid syntax
str_3 = (str_1 str_1)
>>> SyntaxError: invalid syntax
# 但是下面写法不会报错
str_4 = (str_1)

4、面向对象模板拼接

from string import Template
s = Template('${s1} ${s2}!')
print(s.safe_substitute(s1='Hello',s2='world'))
>>> Hello world!

说实话,我不喜欢这种实现方式。浓浓的一股被面向对象思想毒害的臭味。

就不多说了。

5、常用的+号方式

str_1 = 'Hello world! '
str_2 = 'My name is Python猫.'
print(str_1 + str_2)
>>>Hello world! My name is Python猫.
print(str_1)
>>>Hello world! 

这种方式最常用、直观、易懂,是入门级的实现方式。但是,它也存在两处让人容易犯错的地方。

首先,新入门编程的同学容易犯错,他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上例中,拼接前有两段字符串,拼接后实际有三段字符串。

其次,一些有经验的老程序员也容易犯错,他们以为当拼接次数不超过3时,使用+号连接符就会比其它方式快(ps:不少Python教程都是如此建议),但这没有任何合理根据。

事实上,在拼接短的字面值时,由于CPython中的 常数折叠 (constant folding)功能,这些字面值会被转换成更短的形式,例如'a'+'b'+'c' 被转换成'abc','hello'+'world'也会被转换成'hello world'。这种转换是在编译期完成的,而到了运行期时就不会再发生任何拼接操作,因此会加快整体计算的速度。

常数折叠优化有一个限度,它要求拼接结果的长度不超过20。所以,当拼接的最终字符串长度不超过20时,+号操作符的方式,会比后面提到的join等方式快得多,这与+号的使用次数无关。

题外话:你是否觉得20这个数字很熟悉呢?没错,字符串类的特权种族也是以20为限。当时也有一个例子,展示了编译期和运行期的区别,建议你去回看。

6、join()拼接方式

str_list = ['Hello', 'world']
str_join1 = ' '.join(str_list)
str_join2 = '-'.join(str_list)
print(str_join1) >>>Hello world
print(str_join2) >>>Hello-world

str对象自带的join()方法,接受一个序列参数,可以实现拼接。拼接时,元素若不是字符串,需要先转换一下。可以看出,这种方法比较适用于连接序列对象中(例如列表)的元素,并设置统一的间隔符。

当拼接长度超过20时,这种方式基本上是首选。不过,它的缺点就是,不适合进行零散片段的、不处于序列集合的元素拼接。

7、f-string方式

name = 'world'
myname = 'python_cat'
words = f'Hello {name}. My name is {myname}.'
print(words)
>>> Hello world. My name is python_cat.

f-string方式出自PEP 498(Literal String Interpolation,字面字符串插值),从Python3.6版本引入。其特点是在字符串前加 f 标识,字符串中间则用花括号{}包裹其它字符串变量。

这种方式在可读性上秒杀format()方式,处理长字符串的拼接时,速度与join()方法相当。

尽管如此,这种方式与其它某些编程语言相比,还是欠优雅,因为它引入了一个 f 标识。而其它某些程序语言可以更简练,比如shell:

name="world"
myname="python_cat"
words="Hello ${name}. My name is ${myname}."
echo $words
>>>Hello world. My name is python_cat.

总结一下,我们前面说的“字符串拼接”,其实是从结果上理解。若从实现原理上划分的话,我们可以将这些方法划分出三种类型:

格式化类:%、format()、template

拼接类:+、()、join()

插值类:f-string

当要处理字符串列表等序列结构时,采用join()方式;拼接长度不超过20时,选用+号操作符方式;长度超过20的情况,高版本选用f-string,低版本时看情况使用format()或join()方式。

更多关于Python字符串操作方法请查看下面的相关链接

(0)

相关推荐

  • Python日期格式和字符串格式相互转换的方法

    由字符串格式转化为日期格式的函数为: datetime.datetime.strptime() 由日期格式转化为字符串格式的函数为: datetime.datetime.strftime() # encoding: utf-8 import datetime day = datetime.datetime.strptime('2020-2-18 10:54:45', '%Y-%m-%d %H:%M:%S') print(day) print type(day) day = datetime.da

  • Python基础之字符串操作常用函数集合

    Python字符串常用功能汇总 1.字符串的定义 #定义空字符串>>> name=''#定义非空字符串 >>> name="luoahong"#通过下标访问 >>> name[1] 'u'#不能修改字符串的值,否则会报错 >>> name[2] = "3" Traceback (most recent call last): File "<stdin>", lin

  • 基于python3实现倒叙字符串

    这篇文章主要介绍了基于python3实现倒叙字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 google测试工程师的一道题: 设计一个函数,使用任意语言,完成以下功能: 一个句子,将句子中的单词全部倒排过来,但单词的字母顺序不变.比如,This is a real world,输出结果为 world real a is this. 下面利用python来实现: 句子为: 代码如下 #!/usr/bin/env python3.4 # -*

  • python判断变量是否为int、字符串、列表、元组、字典的方法详解

    在实际写程序中,经常要对变量类型进行判断,除了用type(变量)这种方法外,还可以用isinstance方法判断: a = 1 b = [1,2,3,4] c = (1,2,3,4) d = {'a':1, 'b':2, 'c':3} e = "abc" if isinstance(a,int): print ("a is int") else: print ("a is not int") if isinstance(b,list): prin

  • 详解字符串在Python内部是如何省内存的

    起步 Python3 起,str 就采用了 Unicode 编码(注意这里并不是 utf8 编码,尽管 .py 文件默认编码是 utf8 ). 每个标准 Unicode 字符占用 4 个字节.这对于内存来说,无疑是一种浪费. Unicode 是表示了一种字符集,而为了传输方便,衍生出里如 utf8 , utf16 等编码方案来节省存储空间.Python内部存储字符串也采用了类似的形式. 三种内部表示Unicode字符串 为了减少内存的消耗,Python使用了三种不同单位长度来表示字符串: 每个字

  • Python字符串中删除特定字符的方法

    分析 在Python中,字符串是不可变的.所以无法直接删除字符串之间的特定字符. 所以想对字符串中字符进行操作的时候,需要将字符串转变为列表,列表是可变的,这样就可以实现对字符串中特定字符的操作. 1.删除特定字符 特定字符的删除,思路跟插入字符类似. 可以分为两类,删除特定位置的字符 或者 删除指定字符. 1.1.删除特定位置的字符 使用.pop()方法.输入参数,即为要删除的索引. string = '公众号:土堆碎念' list_str = list(string) list_str.po

  • Python如何访问字符串中的值

    这篇文章主要介绍了Python如何访问字符串中的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python访问字符串中的值: 1.可以使用索引下标进行访问,索引下标从 0 开始: # 使用索引下标进行访问,索引下标从 0 开始 strs = "ABCDEFG" print(strs[0]) # A strs = "ABCDEFG" print(strs[3]) # D 2.使用切片操作获取字符串: 示例:[st

  • python字符串替换re.sub()实例解析

    这篇文章主要介绍了python字符串替换re.sub()实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 re.sub(pattern, repl, string, count=0, flags=0) pattern可以是一个字符串也可以是一个正则,用于匹配要替换的字符,如果不写,字符串不做修改.\1 代表第一个分组 repl是将会被替换的值,repl可以是字符串也可以是一个方法.如果是一个字符串,反斜杠会被处理为逃逸字符,如\n会被替换

  • python 实现字符串下标的输出功能

    python 打印字符串索引(下标) 想要直观地看到字符串的下标怎么办? 当然,字符串不是很长的时候,我们可以直接数,012345bulabula 我用一个很简单的循环来输出字符串的文本以及下标: 假设字符串是str1. str1='nottin.soulrn.orlog.iduna' #字符串 def fun(): #不要忘记冒号 j=(str1.rfind('a')) #获取字符串末字符地址 for i in range(0,j+1): #range是左闭右开区间 print(str1[i]

  • 代码总结Python2 和 Python3 字符串的区别

    Python2 >>> >>> isinstance(b'abc', bytes) True >>> >>> isinstance(b'abc', str) True >>> >>> isinstance('abc', str) True >>> >>> isinstance('abc', bytes) True >>> >>>

  • python字符串,元组,列表,字典互转代码实例详解

    python字符串,元组,列表,字典互相转换直接给大家上代码实例 #-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type 'str'> {'age': 7, 'name': 'Zara', 'class': 'First'} print type(str(dict)), str(dict) #字典可以转为元组,返回:('age', 'name', 'class

  • 通过python检测字符串的字母

    这篇文章主要介绍了通过python检测字符串的字母,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import re a = "8a2656" b = "1514561A1321" c = "15465461654" d = "afgwgw" r = re.compile(r

  • python字符串下标与切片及使用方法

    python 字符串下标与切片的实例代码,如下: # !/usr/bin/env python name = "ksunone" # 索引 (下标) """ 所谓"下标",就是编号,就好比超市中的存储柜的编号,通过这个编号就能找到相应的存储空间 列表与元组支持下标索引好理解,字符串实际上就是字符的数组,所以也支持下标索引. 如果想取出部分字符,那么可以通过下标的方法. k s u n o n e 1 2 3 4 5 6 "&q

  • python求一个字符串的所有排列的实现方法

    题目描述: 设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列. 例如输入字符串 abc,要求输出由字母 a.b.c 所能排列出来的所有字符串 abc,acb,bac,bca,cab,cba. 方法:递归法 以字符串 abc 为例介绍对字符串进行全排列的方法. (1) 首先固定第一个字符 a,然后对后面的两个字符 b.c 进行全排列: (2) 交换第一个字符与其后面的字符,即交换 a 与 b,然后对后面的两个字符 a与c 进行全排列: (3) 由于第二步交换了 a与b 破坏了字符串原

  • Python输出指定字符串的方法

    问题描述 输入一串字符,由字母.数字和空格组成,长度 < 1000, 判断其中是否存在日期格式的数据.日期格式的数据具有如下的特征,连续包含年份和月份信息.年份信息是指连续的四个数字,之后是 Jan, Feb, Mar,Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 这些字符串之一 , 如" 2019Nov" 就是符合日期格式要求的数据. 解决方案 从字符串中采取切片的方式来进行指定输出,用条件判断来进行限制输出想要的格式 ( 1 ) 设置

  • python如何把字符串类型list转换成list

    这篇文章主要介绍了python如何吧字符串类型list转换成list,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python读取了一个list是字符串形式的'[11.23,23.34]',想转换成list类型: 方式一: import ast str_list = "[11.23,23.34]" list_list = ast.literal_eval(str_list) print(type(list_list)) 得到结果为:

  • python3 字符串知识点学习笔记

    python字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var2 = "jb51.net" 上面单引号'或双引号"都可以使用 Python 访问字符串中的值 Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用. Python 访问子字符串,可以使用方括号来截取字符串,如下实例: #!/usr/

  • Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space

    今天遇到一个问题,使用python的find函数寻找字符串中的第一个空格时没有找到正确的位置,例如: http://zc.whmc.edu.cn ==> 无法访问的网站或无效的招标网站 使用find(" ")函数寻找时找到的第一个空格对应在==>后面的那个位置.一开始觉得是编码问题,但是文件是用UTF-8编码的,按理说不应该产生编码问题,就用Sublime打开一看是这样的: 可以看到,我的Sublime设置了显示空白,所以第二个红线上方有一个白点,而第一个红线上方却没有,这

随机推荐