字符串的运算
类似于数字之间的运算,字符串也存在运算操作。不过常用的字符串运算方式非常少,只有连接(加法)、复制(乘法)和成员运算。
1字符串连接
字符串的连接运算只存在于字符串与字符串之间,即字符串与字符串连接(字符串与数字或其他类型之间无法进行连接运算)。进行连接运算时,使用加号 +
将两个字符串连接起来,所以我们也可以称之为字符串相加。示例代码如下:
'Python ' + 'is fine'
# 得到:'Python is fine'
'我的' + '爱好' + '是学习'
# 得到:'我的爱好是学习'
2字符串复制
字符串的复制运算只存在于字符串与整数之间,例如 'Python' * n
,表示 n 个 'Python'
连接在一起。如果乘数 n
是负整数或者 0,运算的结果将会是空字符串 ''
。空字符串 ''
乘以任何整数都将得到其本身——即空字符串。示例代码如下:
'Python' * 3
# 得到:'PythonPythonPython'
'Python' * 0
# 得到:''
'Python' * -2
# 得到:''
'' * 100
# 得到:''
3字符串成员运算
成员运算是 Python 字符串中使用最频繁的运算方式,主要功能是判断一个字符串是否出现在另一个字符串中,共有有两种运算方式 in
和 not in
。运算的结果不是字符串,而是布尔值(True
或者 False
),表示一种真与假,或者成立与不成立的状态。这里不再用过多语言来解释了,因为看代码会更便于理解:
'我爱' in '我爱学习'
# 得到:True 说明表达式成立
'我爱' not in '我爱学习'
# 得到:False 说明表达式不成立
'我学习' in '我爱学习'
# 得到:False 说明表达式不成立
'我学习' not in '我爱学习'
# 得到:True 说明表达式成立
'' in '我爱学习'
# 得到:True 空字符串包含在任意字串中, 包括空字符串本身
'' not in ''
# 得到:False
最后,以上三种运算的优先级为:复制运算 > 连接运算 > 成员运算。
字符串转义符
在 Python 中经常会使用字符串存储一些奇怪的字符,比如换行符、制表符等常规字符串不方便表示的字符;或者需要保留字符原本的含义。此时需要用反斜杠 \ 来转义字符,以便于表示特殊字符或字符本身。其中常用的转义字符如下表所示:
转义符的使用方式代码如下图所示:
字符串切片
在 Python 中可以使用切片截取字符串中的一部分字符。比方说,我需要截取字符串"ABCDEFG
"中的第 2 ~ 6 的字符,即 "BCDEF
",这时我们就需要使用字符串切片(slice)来截取字符串的某一部分。
1字符串索引
字符串切片是完全依赖于字符串索引的,所以介绍字符串切片之前需要先介绍字符串索引。索引是序列类数据的一种重要属性,在 Python 的学习过程中,认识并掌握索引是一个具有重大意义的事情。下面我们正式介绍字符串索引。
字符串索引,用白话来说,就是字符串中每一个字符(包括空格,但不包括转义符)的顺序标记。类似于我们日常所说的序号。在 Python 中存在两种索引方式。一种是正序索引,另一种是逆序索引。两种索引共同作用在同一个序列上(字符串也是一种序列)。举例图解,字符串"r.qiyandata.com
"的索引如下图所示:
上图中上面一行蓝色数字是字符串 "r.qiyandata.com
" 的正序索引,正序索引自左向右(自前向后)从 0
开始递增,正序索引值为连续的非负整数,且不含重复值。下面一行蓝色数字是逆序索引,逆序索引自右向左(自后向前)从 -1
开始递减,逆序索引的值为连续的负整数,也不含重复值。
了解字符串的索引之后,就可以继续学习字符串切片了。我们先使用 Python 定义一个字符串,代码如下:
S = "r.qiyandata.com" # 将字符串 "r.qiyandata.com" 赋值给变量 S
print(S) # 输出变量 S
# 输出:r.qiyandata.com
在字符串中可以通过方括号[]
来获取相应索引位置或范围内的字符,这就是字符串切片。切片共有三个参数,三个参数分别是 start、stop 以及 step,分别表示起始索引,终止索引和步长。三者使用冒号:
分隔开。表示从左向右截取字符串中索引从 start(包含 start 本身,默认值为 0)到 stop (不包含 stop 本身,默认值为字符串长度,如果使用了默认值,则包含字符串最后一个字符),步长为 step (默认值为 1)的字符。
[start:stop:step]
重点在于从 start 到 stop 是一个左闭右开区间[start,stop)
。理解上面这段话需要一点时间,笔者下面使用代码帮助你体会其中的含义。
2案例
案例一
需要截取 S("r.qiyandata.com"
) 中的 "qiyandata"
。示意图和切片代码截图如下:
从上面的代码中已经可以看出索引的使用非常灵活。我们注意到,上面四种切片方式使用的步长均为 1(step 的默认值就是 1),这种情况下我们可以直接省略 step 参数。仅使用 start 和 stop 即可。代码如下图所示:
案例二
截取字符串 S 中的前 7 个字符,示意图和切片代码截图如下:
观察上面的示意图可以发现,无论使用正序索引还是逆序索引,start 参数指向的都是 S 中索引为 0 的字符 r,也就是说 start 的值(0、-15)全部等价于默认值 0。此时我们可以省略 start 参数,让其使用默认值。省略 start 参数后的代码如下图所示:
这里需要注意,不同于省略步长 step,省略 start 时,start 与 stop 之间的冒号不能省略,只有保留冒号,系统才知道你省略的是 start。否则 Python 无法判断你的意图。
案例三
需要截取字符串 S 中的最后四个字符,示意图和切片代码截图如下:
以上代码中有几处需要注意的地方。
-
首先,第一行代码中,正序索引 15 实际上是不存在的,但是由于我们的目的是获取最后 4 的字符,所以这里的 stop 只要是大于最后一个字符
m
的正序索引14
的正整数即可。比如:同理,当需要获取字符串的前几个字符时,将 start 设置为小于等于(因为是左闭右开)首个字符 r 的逆序索引 -15 的负整数即可,代码如下图所示:
-
其次,由于
[start,stop)
为左闭右开区间,即不包含索引为 stop 的字符,所以切片代码S[-4:-1]
并没有获取到最后四个字符中最后一个字符m
。后面我们使用切片代码S[-4:]
省略了 stop 参数,此时最后一个字符也被包含其中,也就达到了我们的目的。
案例四
从字符串 S 的首个字符开始,直到最后一个字符结束,每隔一个字符获取一个字符。示意图和切片代码如下:
可如果步长 step 设置为负数 -1
,会发生什么呢?继续往下看
案例五
将字符串 S 反转,通俗地说,就是把 "r.qiyandata.com
" 倒着写。这次没有示意图了,代码如下:
需要注意的是,当步长 step 设置为负数时,字符产切片是从右向左(从后向前)来截取字符串的。此时切片将会从后向前从 start 开始(包含 start)到 stop 结束(不包含 stop 本身),并配合步长 step 来完成切片。比如我想要截取 S 的最后四个字符并要求字符顺序是反过来的,示意图如下:
那么我们可以使用下图所示代码完成操作:
案例六
需要截取字符串 S 中的某一个字符,比如说第 6 个字符(由于索引从 0 开始,第六个字符的索引就是 5)。
按照上面的逻辑,我们当然可以使用下面的代码来处理:
不过上面这种方式太麻烦了,我们直接使用所需字符的索引即可,代码如下图所示:
以上六个分别介绍了 Python 中字符串的切片操作。追求实用性的读者可以只看案例一、案例二、案例三和案例六,会更好理解一些。
字符串常用函数
1其他类型转化为字符串
Python 中使用 str()
函数来将非字符型的数据转为字符型数据。如果接收的数据已经是字符型数据了,那么就会返回其本身,str()
函数的简单使用如下:
2字符串长度
上期文章中有讲到,字符串是一种序列类型。在 Python 中,序列类型一般都会有一个长度属性,用来表示序列中元素的数量。而字符串的长度就是字符串中字符的数量,Python 中使用函数 len()来获取序列的长度,也可以用来获取字符串的长度,示例代码和注意事项如下:
什么是转义符?
在 Python 中经常会使用字符串存储一些奇怪的字符,比如换行符、制表符等常规字符串不方便表示的字符;或者需要保留字符原本的含义。此时需要用反斜杠 \
来转义字符,以便于表示特殊字符或字符本身。其中常用的转义字符如下表所示:
转义符的使用方式代码如下图所示:
3英文字母大小写转换
Python 是以英语为基础开发的编程语言,我们在实际的使用中经常会处理含有英文的字符串,其中,大小写转换是一个较为常见的操作。
(1)英文单词首字母大写
Python 中使用 title()
来将字符串中每一个单词的首字母转为大写。处理过程会自动忽略非英文字符。示例代码如下图所示【注意 title()
函数和 len()
函数在使用上的区别】:
(2)英文字母全部转为大/小写
Python 中使用 upper()
函数来将字符串中每一个英文字母转为大写;使用 lower()
函数来将字符串中每一个英文字母转为小写,处理过程会自动忽略非英文字符。这两个函数的使用示例如下图所示:
4去除字符串两端空白字符
Python 中使用 strip()
去除字符串两端的所有空白字符,需要注意的是,在 Python 中空白字符并非单独指空格符,它还包含了换行符\n
、制表符(\t
和\v
)、回车符\r
、换页符\f
等字符。strip()
函数的使用示例如下图所示:
另外,当我们只需要去除字符串其中一端的字符时,可以使用 lstrip()
和 rstrip()
。使用 lstrip()
可以去除字符串左端的所有空白字符;使用 rstrip()
可以去除字符串右端的所有空白字符。使用示例如下:
strip()
系列除了可以去除字符串两端的空白字符之外,还可以去除字符串两端的指定字符或指定字符组合。这种操作同样适用于 lstrip()
和 rstrip()
, 使用示例如下:
除此之外,strip()
系列还可以去除字符串两端的特定字符组合。比如下图代码中表示去除字符串两端的所有由字符 'A'
和 'B'
组成的任意排列组合,而不是仅去除字符串两端的 'AB'
。只传入一个字符时也是同样的原理。
5字符串替换
Python 中使用 replace()
函数将字符串中的指定字符替换为需要的字符,还可以限制替换的次数。与 strip()
函数不同的是,replace()
函数可以替换字符串中任意位置的指定字符,并不局限于字符串两端,而且它替换的字符也不是输入字符的排列组合,而是输入字符本身。使用示例如下:
6字符串分割
Python 中使用 split()
可以根据指定字符(串)将一个字符串分割为若干个字符串,被分割开的字符串存储在一个列表(后续文章会介绍列表)中。这样说可能不易理解,我们可以看下面的代码:
与 split()
对应的是 join()
,join()
的作用是使用指定的字符(串)将一个列表中的字符串元素连接为一个长字符串。使用示例如下图所示:
字符串格式化
字符串格式化(因为经常与输出函数 print()
一起使用,所以也称字符串格式化输出)是一种灵活的字符串转化和连接操作。在 Python 程序中使用非常广泛,现行的 Python 主要有三种字符串格式化方式。
介绍字符串格式化之前,我们先在一个具体的使用场景中简单了解它的作用。假设我们需要运行一个程序,这个程序的功能是循环处理 10000 条数据,但是由于程序一旦执行,不会允许中途修改代码,而且程序在执行过程中不会告诉我们它运行到了那一步,这会导致我们对程序执行时间没有把握。此时我们就可以使用字符串格式化技术来输出程序执行过程中产生的变量,帮助我们了解程序执行的进度,预估程序执行需要花费的时间。简单的使用如下图所示:
如上图所示,最后一行代码中我们输出的汉字是不变的,但是花括号内的变量 i
会随着程序的执行不停地变化(这段代码中的变量 i
表示程序在 10000 次循环中的顺序位置)。我们在每一次循环中都输出这个变量,就可以了解程序执行的进度。
实际编程中字符串格式化的使用场景还有很多,更多用法还需要在实际应用中探索。下面我们先来看看几种常见的格式化方法。
1% 格式化
% 格式化
是 Python 中出现最早的字符串格式化方法,% 格式化的作用是将百分号 % 后面的内容按顺序填充到百分号 % 前面的字符串对应位置中。简单的使用如下图所示:
从上图中可以看出,% 格式化会将字符串后面的内容填充到字符串中占位符 %s
的位置上,实际上占位符不仅仅只有 %s
,这里使用 %s
的原因是,该位置填充数据的类型是字符型。最常用的三种占位符和其对应数据的类型如下表所示:
同时包含以上三种占位符的 % 格式化示例代码如下:
2format 格式化
format 格式化
是一种自由度更高的字符串格式化方法,它摒弃了 % 格式化中使用 % 占位符的设定,改用一对花括号 {}
作为占位符,并且不再区分填充值的类型。format 格式化的简单使用示例如下:
这看上去要比 % 格式化简单不少。此外,format 格式化还新增了指定顺序填充以及关键字填充等功能。用法非常清晰易懂,使用示例如下:
3f-string 格式化
f-string 格式化
是 Python 最晚出现的格式化方法, Python 3.6 以上的版本才能够使用这种方式进行字符串格式化。这是一种非常简单易懂的字符串格式化方式,非常受程序员欢迎。f-string 格式化的使用方式如下:
实际上,字符串格式化输出是一个非常复杂的知识点,笔者在介绍这个知识点的时候,仅仅介绍了其中 10% 的内容,但是这 10 %的内容,已经足够覆盖实际编程中 95% 以上的使用场景。“花小钱办大事儿”,何乐而不为呢?