吃透Python-第 6 章 字符串

吃透Python-第 6 章 字符串

从第 1 章开始我们就一直在使用 str 型的字符串。本章,我们将继续学习字符串,以熟练掌握其用法。

字符串和 str 型
字符串的元素
索引运算符 [] 和索引表达式
分片运算符 [:] 和分片表达式
使用 len 函数获取字符串的长度(元素总数)
遍历字符串
可迭代对象
enumerate 函数
线性搜索字符串中的字符
判断字符串的大小关系和等价性
判断字符串是否相同
成员运算符(运算符 in 和运算符 not in)
find 方法和 rfind 方法
index 方法和 rindex 方法
拼接字符串和分割字符串
join 方法
替换字符串和删除字符串
字符串的格式化(运算符 %format 方法和 f 字符串)

6-1 字符串的基础知识

从第 1 章开始我们就一直在使用 str 型的字符串。本章,我们将继续学习字符串,以熟练掌握其用法。

字符串
  关于字符串,我们学习了以下内容。

字符串的类型是 str 型。
字符串由一系列字符组成,字符串字面量用于表示字符序列。
如何使用加法运算符 + 拼接字符串,以及如何使用乘法运算符 * 重复字符串。
如何在屏幕上输出字符串,以及如何从键盘读取字符串。
如何将字符串转换为整数和实数,以及如何将整数和实数转换为字符串。
如何在字符串中插入格式化的整数或实数。
没有字符的空字符串,其逻辑值为 False。
字符串的值不能改变,即字符串是不可变类型。
▶ 许多编程语言会将单一字符作为字符,将任意数量的字符排列在一起所形成的内容作为字符串进行区分。Python 则没有区分字符和字符串,单一字符会被当作只有 1 个字符的字符串处理。

元素和索引
  本节,我们将继续学习字符串,熟练掌握其用法。

首先,思考字符串 ‘ABCDEFG’。因为字符串由一系列字符组成,所以如图 6-1 所示,7 个字符会按顺序连续排列。其中的一个个字符称为元素(element)。

在这里插入图片描述

图 6-1 字符串和两种索引

图中所示的小字整数是字符串的索引(index)。使用索引可以方便地取出字符串中的各个字符(元素)。字符串有以下两种索引。

非负数索引

从头开始按顺序排列为 0, 1, 2, …, ( 元素总数 -1)。

其索引值表示距第一个元素的偏移(offset),即位于第一个元素后的第几个元素。

负数索引

从末尾开始按顺序排列为 -1,-2,-3, …, (- 元素总数 )。

负数索引值是非负数索引值减去元素总数(本例中为 7)得到的值。另外,我们也可以把该值理解为 -( 从末尾开始的第几个元素 )。

不论哪一种索引值,都要插入索引运算符(index operator)“[]”中使用。索引表达式(subscription)的形式如下。

在这里插入图片描述

图 6-2 为索引表达式的一个示例。从头开始的第 3 个字符 ‘C’ 可以通过索引表达式 s[2] 或 s[-5] 进行访问(读写)。

在这里插入图片描述

图 6-2 索引运算符

现在我们使用索引运算符打印输出字符串内的所有字符。

代码清单 6-1 …该程序使用非负数索引 0~6 打印输出字符串内的所有字符。
代码清单 6-2 …该程序使用负数索引 -7~-1 打印输出字符串内的所有字符。
  仔细阅读上述程序后,我们就能大致理解索引运算符的使用方法了。

另外,指定了不合适的索引值(本例中为小于等于 -8 或大于等于 7 的数)会导致错误产生。

在这里插入图片描述

▶ 执行以下程序后,程序会发生错误(产生了 IndexError 异常,程序终止执行)。我们来通过以下程序进行确认。

chap06/list0601x.py…该程序在代码清单 6-1 的基础上添加了打印输出 s[7] 的代码。
chap06/list0602x.py…该程序在代码清单 6-2 的基础上添加了打印输出 s[-8] 的代码。

使用索引遍历字符串
  如果将字符数较多的字符串作为对象,或将任意字符数的字符串作为对象,那么针对所有元素逐一指定索引的方式(如前面介绍的程序所示)存在很大缺陷。

代码清单 6-3 通过 for 语句循环对程序进行了优化,并修改程序使其从键盘读取字符串。

在这里插入图片描述

首先来看蓝色底纹部分的 len( s)。len 函数是内置函数,传入字符串参数后,函数返回字符串的元素总数(字符总数)。具体如图 6-3 所示。

在这里插入图片描述

图 6-3 遍历字符串

len 这个名字来源于 length,表示长度。该函数不仅可以获取字符串的元素总数,还可以获取下一章介绍的列表的元素总数。

要点 使用 len 函数可以获取字符串(列表等)的元素总数。

在运行示例中,len(s) 等于 6。因此,for 语句中 i 的值会从 0 递增到 5,同时,程序输出“i 的值”和“s[i] 的值”。

索引 i 的值会从 0 递增到 5,即图中用蓝色圆底的数字 0 、1 等表示的值。

然后,s[i] 为索引对应的元素值,即 ‘A’、‘B’ 等。

▶ 也就是说,现在获取的字符是 s[i],其索引是 i。

屏幕按顺序显示 0 和 A,1 和 B 等。

请试着输入各种字符串。因为程序使用 len(s) 获取了字符串的长度,所以程序会从头到尾输出所有字符。

按顺序获取元素称为遍历。请记住这个基本的编程术语。

▶ 有多种方法可以让程序遍历字符串并打印输出字符串。请通过代码清单 6-8~代码清单 6-12 所示程序进行学习。

搜索字符串内的字符
  代码清单 6-4 是一个通过遍历字符串,搜索其中有无特定字符,并在有特定字符的情况下输出字符位置的程序。

在这里插入图片描述

与前面相同,在此运行示例中,‘ABCDEF’ 读取到 s 中,所以 len(s) 的值等于 6。程序执行 for 语句后,i 的值从 0 递增到 5,同时,程序对字符串进行遍历。

搜索成功

在按顺序从头遍历字符串时,如果读取的字符 s[i] 与要查找的字符 c 相等,则搜索成功。

在运行示例 1 中,遍历过程如图 6-3 所示,从 a遍历到d 时, d 中的 s[i] 与变量 c(即 ‘D’)相等。搜索成功后,程序输出相应信息,然后执行 break 语句,强制结束 for 语句的运行。

搜索失败

如果 for 语句(程序没有执行 break 语句来强制结束)执行循环一直到最后,即遍历到 f 也没有查找到字符,就说明字符串 s 中没有要查找的字符 c。此时搜索失败,程序会输出相应的信息(运行示例2 )。

▶ 注意,程序末尾的 else 代码块属于 for 语句而不是 if 语句。

像该程序那样,以排列的元素为对象,从头开始按顺序逐个读取元素进行搜索的算法称为线性搜索(linear search)。大家也要牢记这个基础术语。

▶ 这里,我们学习了搜索方法。实际程序一般会使用运算符 in(第 136 页)和 find 方法(第 140 页)。

分片
  学习完索引,现在开始学习分片。分片指从字符串中取出连续的一部分字符或按一定周期取出一部分字符,生成新的字符串。分片有两种形式。

在这里插入图片描述

使用了分片运算符的分片表达式(slicing)在 [] 中需要插入一个或两个冒号。在分片表达式中指定的值含义如下。

开始 i   …相当于取出范围内的第一个元素的索引

 结束 j   …相当于取出范围内的最后一个元素的下一个元素的索引

 步进 k   …取字符的间隔

分片时取出的最后一个元素不是 s[j],而是 s[j] 之前的元素(专栏 6-1)。

另外,如果 k 为负数,分片时则反向取出字符。

现在我们通过示例进行确认。字母表的 26 个大写字母排列成字符串 s,程序分片取出 s 的字符。请参照右图进行学习。

在这里插入图片描述

在指定 i、j 和 k 时,需要遵循以下规则。

i 和 j 如果大于 len(s),则程序认为 i 和 j 等于 len(s)。

与索引不同,即使指定正常范围以外的值,程序也不会产生错误。

 

i 省略或为 None 时,程序认为 i 等于 0。

j 省略或为 None 时,程序认为 j 等于 len(s)

以上规则稍显复杂,但实际上,正因为有了这些规则,我们才可以轻松指定分片中的数字。我们来看几个例子。

所有元素

在取出所有元素时,使用分片表达式指定 i 为 0,j 为 len( s),即 s[0:26]。但是,分片表达式也可以使用只省略 j 的 s[0:] 表示,还可以使用 i 和 j 都省略的 s[:] 表示。

从某个元素开始到末尾

在取出从索引 i 的元素开始到末尾的元素时,需要使用省略了 j 的分片表达式 s[i:]。

最后 n 个元素

使用 s[-n:] 取出末尾的 n 个元素。

在省略 i、j 和 k 中的一个或多个的情况下,分片表达式的使用方法总结如下。

s[:] 所有字符 s[:] ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’
s[:n] 开头的 n 个元素 s[:5] ‘ABCDE’
s[i:] 从 s[i] 开始到字符串末尾 s[5:] ‘FGHIJKLMNOPQRSTUVWXYZ’
s[-n:] 最后 n 个元素 s[-5:] ‘VWXYZ’
s[::k] 每隔 k - 1 个元素取出一个元素 s[::3] ‘ADGJMPSVY’
s[::-1] 反向取出所有元素 s[::-1] ‘Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值