购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.4 字符串下标与切片

字符串是由字符所组成的列表对象(类似于其他语言中的数组),如果想要获取字符串中的字符,有三种方式:

(1)通过下标值(index,或称为索引值)来获取某个字符。

(2)使用切片(slice)方法获取某段字符串。

(3)调用split()方法分割字符串。

5.4.1 通过下标值获取某个字符

字符串对象可以使用下标值来获取字符,下标值从0开始,假设有一个字符串str1="Hello",那么str1的长度就是5,字符串中的元素分别为str1[0]、str1[1]、str1[2]、str1[3]、str1[4]。

下标值为正值,表示从字符串开始处从左往右数,负值则表示从字符串末尾从右往左数,例如str1[0]表示获取字符串的第1个字符,str1[-1]表示获取字符串的最后一个字符。譬如以下程序语句,分别是获取第1个字符与倒数第2个字符:


str1 = "Hello!How are you?"
print(str1[0])   #执行结果:H
print(str1[-2])  #执行结果:u

学习小教室

字符串对象一旦被赋值或设置,它的内容就是不可变的(immutable),重新给字符串对象赋值是创建一个新的字符串而不是修改原字符串,原来的字符串对象会在适当的时机通过Python的垃圾回收机制被系统回收。因此,字符串对象可以使用下标值来读取其中的字符,但是不能通过下标值给对应的字符串位置赋值(这点和字符数组不一样)。例如下面的程序语句就会发生错误:


str1[0] = "A"

5.4.2 通过切片读取某段字符串

slice(切片),顾名思义就是从字符串中读取某一段字符串,字符串的字符具有顺序性,我们可以使用“[]”运算符来读取字符串中的单个字符或子字符串,这个操作被称为“切片”。格式如下:


字符串[起始下标:结束下标:间隔值]

对字符串进行“切片”时,如果不用间隔取值,就可以省略间隔值不写。我们在表5-4中整理出了使用“[]”运算符读取序列元素的方法。

表5-4

例如以下字符串切片运算:


str1 = "ABCDEFGHIJK"
print(str1[3:6])   #执行结果DEF

上面的程序语句表示从下标值3开始一直读取到结束下标6-1为止,所以会取出DEF字符串。也就是说,slice方法读取的字符串长度正好是结束下标与起始下标相减得到的差值,在此例中,str1[3:6]读取的字符串长度是6-3=3。

如果是从头开始读取字符串,那么起始下标可以省略不写;如果要读取到字符串结尾,那么结束下标可以省略不写,举例来说(slice.py):


str1 = "ABCDEFGHIJK"
print(str1[:7:2])  # ACEG
print(str1[2::2])  # CEGIK
print(str1[::2])   # ACEGIK

上述程序第2行到第4行都是每间隔2个字符读取字符串,第2行语句没有写起始下标,表示从起始位置(也就是下标值0)开始;第3行语句没有写结束下标,表示读取到最后一个字符;第4行语句既没有起始下标又没有结束下标,表示目标是读取完整的str1字符串。

5.4.3 调用split()方法分割字符串

split()方法可以按照指定分隔符将字符串分割为子字符串,并返回子字符串的列表。格式如下:


字符串.split(分隔符, 分割次数)

默认的分隔符为空字符串,包括空格符、换行符(\n)、制表符(\t)。调用split()方法分割字符串时,会将分割后的字符串以列表(list)返回。范例程序如下:

【范例程序:split.py】分割字符串


01        str1 = "Do \none \nthing \nat a time!"
02        print( str1.split() )
03        print( str1.split(' ', 1 ) )

程序的执行结果如图5-4所示。

图5-4

程序解析:

·第02行:没有指定分割字符,所以会以空格与换行符(\n)进行分割。

·第03行:指定以空格来分割,因而分割了2个子字符串之后就不再分割了。

以下范例程序使用前面介绍的切片运算将26个小写英文字母反转输出,大家不妨上机练习看看。

【范例程序:ReverseString.py】将26个小写英文字母反转后输出


01        # -*- coding: utf-8 -*-
02        letters = ""
03        for x in range(97, 123):
04            letters += str(chr(x))
05        print(letters)
06
07        revletters = letters[::-1]
08        print(revletters)

程序的执行结果如图5-5所示。

图5-5

范例中调用chr()函数返回ASCII码对应的字符,并使用for循环将字符相加后赋值给变量letters,再调用切片(slice)方法将字符串反转。这里所用的ASCII码采用了十进制表示法,97~122分别对应的是小写英文字母a~z,而65~90对应的是大写英文字母A~Z,供大家参考。

技巧

chr()函数可以返回ASCII码对应的字符,调用ord()函数可以返回字符对应的ASCII码。

【范例程序:ReverseStringBIG.py】将26个大写英文字母反转后输出


01        # -*- coding: utf-8 -*-
02        letters = ""
03        for x in range(65, 91):
04            letters += str(chr(x))
05        print(letters)
06
07        revletters = letters[::-1]
08        print(revletters)

程序的执行结果如图5-6所示。

图5-6

同理,若要反转数字,则可以参考下面的范例程序。

【范例程序:ReverseString.py】将数字反转后输出


01        # -*- coding: utf-8 -*-
02        letters = ""
03        for x in range(48, 58):
04            letters += str(chr(x))
05        print(letters)
06
07        revletters = letters[::-1]
08        print(revletters)

程序的执行结果如图5-7所示。

图5-7

这里要补充一点,split()的作用是将字符串分割,而join()方法正好相反,它会把字符串串接起来。 6cKS7rz9zwYtEnjNK3jhrcwI1a8/I2RHJPuXkLtzM22cqmjiN7koYiVqQq9hK88f

点击中间区域
呼出菜单
上一章
目录
下一章
×