如果读者从来没有学习过编程、数据库等方面的知识,对“索引”这个词的理解可能更原汁原味。“索引”原本是指将书刊中的主要内容,比如章节名称、重要名词等罗列出来,并给出它们相应的页码,以便于查阅——本书的目录就是索引。在编程语言和数据库中,也少不了“查阅”行为,于是引入了“索引”概念。
字符串一般由多个字符组成,给这些字符创建索引( Index ),目的就在于可以更便捷地操作字符串中的字符。
在 Python 中,依据字符串中各个字符的位置创建其索引,如图4-2-3所示,其创建方法有如下两种:
0 、1 、2 、…,直到最右边的字符结束。特别注意,此时第一个字符编号为 0 ,而不是 1 ,这是 Python 语言的规定(很多其他编程语言也这样规定,但是,也有的编程语言规定从 1 开始计数)。-1 、-2 、-3 、…,直到最左边的字符结束。
图4-2-3 字符串中的索引
如图4-2-3所示,对字符串中的所有字符建立了索引。因为以上两种创建索引的方法,于是字符串中每个字符可以有两个索引数字,例如索引 5 和索引 -6 都指向了字符 n。
字符的索引建立好了,自然就可以通过索引“查阅”相应字符了——就如同通过书的页码找到相应的页面。在 Python 中实现这种操作的方式是使用 [ ] 符号。在交互模式中完成如下操作:
>>> book = 'python book'
>>> book[0]
'p'
>>> book[-11]
'p'
变量 book 引用了图4-2-3所示的字符串对象,book[0] 的方括号 [ ]里面的整数 0 就是一个字符的索引——显然此索引是按照方法1创建的,返回值为索引 0 所对应的字符 'p' 。在 book[-11] 中所使用的索引是 -11——按照方法2创建的,对照图4-2-3,返回值也是字符 'p' 。读者不妨再做几个练习,熟悉以索引得到对应字符的操作方法。
>>> book[7]
'b'
>>> book[11]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
执行 book[11] 后出现 IndexError 异常,从提示信息中可知,是索引 11 超出了字符串的索引范围。根据图4-2-3,此字符串的最大索引是 10 ——但是字符串共计 11 个字符,请读者注意区分图4-2-3和表4-2-2的差异:字符串的长度不等于最大索引值。为了避免此错误,可以用下面方法得到最大索引:
>>> max_idx = len(book) - 1
>>> max_idx
10
>>> book[max_idx]
'k'
上面实现了“从索引到字符”的操作,反过来,根据字符“找到”索引,是否可以?
Python 字符串有一个方法能够实现(关于“方法”,参见4.2.6节)。
>>> book.index('k')
10
>>> book.index('o')
4
index() 就是字符串对象 book 的一个方法,其参数 'k' 是字符串中的一个字符,返回值为该字符对应的索引——按照方法1创建的索引。
在 book.index('o') ,返回的是 book 字符串( 'python book' )中按照从左向右顺序第一个字符 'o' 的索引。
如果备查的字符不在字符串中:
>>> book.index('m')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
会抛出异常。
以上是字符串的 index() 简单应用,若看一看它的帮助文档(参阅第3章3.3节【自学建议】),不仅仅会有新发现,而且对前面所述的操作也有高屋建瓴的理解。
在交互模式中按照下面的方法操作,查看 book.index() 的帮助文档:
>>> help(book.index)
显示如下内容:
index(...) method of builtins.str instance
S.index(sub[, start[, end]]) -> int
Return the lowest index in S where substring sub is found,
such that sub is contained within S[start:end]. Optional
arguments start and end are interpreted as in slice notation.
Raises ValueError when the substring is not found.
S.index(sub[, start[, end]]) 是此方法的调用方式,其中参数解释如下:
sub :全称是“ substring ”,即字符串的子集,在4.2.3节曾介绍过,字符串的字符、部分字符组成的字符串和空字符串都是字符串的子集,也就是说这些都可以用于 index() 的参数。例如:
>>> book.index("python")
0
>>> book.index("")
0
>>> book.index("oo")
8
[, start[, end]]:此处的 [ ] 含义不是对象的索引操作符号,其含义详见第3章3.3.1节有关内容。start 和 end 是检索 sub 的索引范围(但不包含 end 所对应字符),比如:
>>> book.index('o')
4
>>> book.index('o', 7, 9)
8
>>> book.index('o', 5, 8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
为了直观地理解上述操作结果,用图4-2-4指明每个表达式中检索的索引范围。

图4-2-4 索引范围示意