字符串是由Python内置的str类定义的,是由一系列Unicode编码的字符组成的有序序列。字符串是一种不可变对象,字符串中的字符是不能被改变的,每当修改字符串时都将生成一个新的字符串对象。对于字符串可以进行各种各样的操作,主要包括通过索引访问指定位置的单个字符,通过切片从给定的字符串中获取某个子串,将两个或多个字符串连接成一个新的字符串,对两个字符串进行比较,使用for循环遍历字符串。
字符串是由一系列Unicode编码的字符组成的序列类型,可以使用方括号运算符[]和一个数字索引来访问指定位置上的字符,其一般语法格式如下:
字符串[索引]
其中字符串可以是字符串类型的常量、变量或表达式;索引可以是一个整数类型的常量、变量或表达式,用于对字符串中的字符进行编号,索引值可以是正数、负数和0。按从左向右的顺序,左边第一个字符的索引为0,第二个字符的索引为1,最右边字符的索引比字符串的长度小1。字符串的长度可以使用内置函数len()求出。索引值也可以是负数,负数表示从右向左进行编号,-1表示最右边字符(即倒数第一个字符)的索引,-2表示倒数第二个字符的索引,以此类推。
字符串s中各个字符的索引设置如图3-1所示。
图3-1 字符串中字符的索引
通过索引访问字符串中的指定字符时,所使用的索引值必须是整数。使用正向索引时,最小值为0,最大值比字符串长度小1;使用反向索引时,最小值为字符串长度值的相反数,最大值为-1。无论使用正向索引还是反向索引,索引值都不能越界,否则将会出现错误信息“IndexError:string index out of range”,即字符串索引超出范围。
下面给出通过索引获取指定位置上字符的例子。
>>>s=″Hello,Python″
>>> s[0]
′H′
>>> s[1]
′e′
>>> s[-1]
′n′
>>> s[-2]
′o′
因为字符串属于不可变对象,所以使用索引只能读取字符串指定位置上的字符,而不能修改该位置上的字符。例如,如果试图对 s[0]重新赋值,则会出现错误信息“TypeError:′str′object does not support item assignment”,即字符串对象不支持赋值操作。
因为字符串属于序列类型,所以可以使用for循环来遍历字符串。例如:
【例3.4 】 从键盘输入一个字符串,然后以相反顺序输出该字符串。
【算法分析】
要按相反顺序输出字符串,可以使用while循环和负数索引来实现。以索引值作为循环变量,该变量的初始值为-1,终止值为字符串长度的相反数,字符串长度用len()函数求出。每输出一个字符后使循环变量减1。
【程序代码】
【运行结果】
使用索引可以读取字符串指定位置上的单个字符。如果要按位置从字符串中提取一部分字符(称为子串),则可以通过切片(slice)操作来实现,其一般语法格式如下:
字符串[开始位置:结束位置:步长]
其中字符串可以是字符串类型的常量、变量或表达式;开始位置、结束位置和步长均为整数,对它们使用冒号进行分隔;开始位置指定开始切片的索引值,默认值为0;结束位置指定结束切片的索引值,但不包括这个位置在内,默认值为字符串的长度;步长用于指定索引值每次增加的数值,默认值为1;当省略步长时,也可以顺便省略最后一个冒号。
下面给出字符串切片操作的一些例子。
由于字符串是不可变对象,因此不能对字符串切片赋值,否则会出现错误信息“TypeError:′str′object does not support item assignment”。
【例3.5 】 从键盘输入一个字符串,然后通过切片操作实现字符串的逆序输出。
【算法分析】
可通过字符串切片操作来实现字符串逆序输出,在方括号运算符中省略开始位置和结束位置参数,并将步长设置为-1即可。
【程序代码】
s=input(″请输入一个字符串:″)
print(s[::-1])
【运行结果】
在Python中,字符串的连接可以使用加法运算符“+”或乘法运算符“*”来实现。加法运算符可以将两个字符串连接成一个新的字符串,乘法运算符则可以将一个字符串自身重复连接若干次而形成一个新的字符串。当用于字符串连接时,运算符“+”和“*”均支持复合赋值操作。
1.基本连接
在Python中,运算符“+”有3个作用,一是作为双目运算符用于数值对象,进行加法运算;二是作为单目运算符用于数值对象,表示正号;三是作为双目运算符用于字符串对象,进行字符串的连接操作。
将运算符“+”作为字符串连接运算符使用时,可以将字符串常量、字符串变量以及返回值为字符串的函数表达式等字符串数据连接起来,由此构成一个字符串表达式,其一般语法格式如下:
字符串1+字符串2+…+字符串 n
其中各个字符串可以是字符串类型的常量、变量或函数。整个字符串表达式的值也是字符串类型。
例如,下面的例子用于连接两个字符串,程序运行结果是生成了一个新的字符串。
>>>″Python″+″程序设计″
′Python程序设计′
将运算符“+”作为字符串连接运算符使用时,该运算符两侧都必须是字符串类型。若要将字符串与数值连接起来,则应使用内置函数str()将数值转换为字符串。例如:
>>>str(2018)+″年″+str(1)+″月″+str(31)+″日″
′2018年1月31日′
2.重复连接
在Python中,运算符“*”是一个双目运算符,它有两个作用,一是作为算术运算符用于数值对象,进行乘法运算;二是作为重复连接运算符用于字符串和正整数,进行字符串的重复连接操作。
将运算符“*”作为字符串重复连接运算符使用时,可以将一个字符串自身重复连接若干次,从而构成一个字符串表达式,其一般语法格式如下:
字符串*正整数
或者
正整数*字符串
其中字符串可以是字符串类型的常量、变量或函数,正整数用于指定这个字符串重复连接的次数。
下面的例子中,将字符串“Python”重复连接3次,得到一个新的字符串:
>>>x=″Python″
>>> n=3
>>> x*n
′PythonPythonPython′
【例3.6 】 从键盘输入一些单词,然后使用这些单词组成一个句子。
【算法分析】
由于输入单词的数目不确定,因此可以考虑使用条件恒真的while语句来构成一个无限循环。当输入指定的内容时,将执行break语句以结束循环过程。使用字符串连接运算符连接所输入的单词,即可将其连词成句。
【程序代码】
【运行结果】
对于字符串进行的关系运算主要包括:使用各种关系运算符对两个字符串进行比较,使用成员运算符in来判断一个字符串是不是另一个字符串的子串。
1.比较字符串
比较两个字符时,是按照字符的Unicode编码值的大小进行比较的。西文字符按其ASCII编码值(与其Unicode编码相等)进行比较的,其按从小到大顺序排列,依次是空格字符、数字字符、大写字母以及小写字母。中文字符是按其Unicode编码值进行比较的。例如:
>>>″a″>″b″
False
>>>″9″<″m″
True
>>>″啊″>″中″
True
″啊″>″A″
True
比较两个长度相同的字符串时,是将两个字符串的字符从左向右逐个进行比较,如果所有字符相等,则两个字符串相等;如果两个字符串中有不同的字符,则以最左边第一对不同的字符的比较结果为准。例如:
比较两个长度不相同的字符串时,首先在较短的字符串尾部补上一些空格字符,使两个字符串具有相同的长度,然后再进行比较。例如:
2.判断子串
在Python中,成员关系运算符in用于测试指定的值是否包含在目标序列中。使用该运算符可以判断一个字符串是否为另一个字符串的子串,其一般语法格式如下:
字符串1 [not] in 字符串2
如果字符串1是字符串2的子串,则返回True,否则返回False。
下面给出使用in运算符判断子串的一些例子。
>>>″yt″in″Python″
True
>>>″mn″in″Python″
False
【例3.7 】 从键盘输入两个字符串,比较它们的大小并判断第一个字符串是不是第二个字符串的子串。
【算法分析】
首先通过内置input()函数来输入两个字符串并将其存储在变量s1和s2中,然后使用多分支if语句来判断两个字符串之间的大小关系,最后使用另一个多分支if语句来判断第一个字符串是否是第二个字符串的子串。
【程序代码】
【运行结果】
再次运行程序: