字符串——序列操作

未匹配的标注

作为序列,字符串支持假定项之间是按位置排序的操作。比如,如果有一个4个字符的字符串编码在括号中(通常是单引号变体),可以用内置的len 函数来确认它的长度并使用索引的表达式来获取它的组成部分:

>>> S = 'Spam' # 创建一个4字符的字符串,并赋值给一个名称
>>> len(S) # 长度
4
>>> S[0] # 在S中的第一项,使用0基位置来索引
'S'
>>> S[1] # 从左数的第二项
'p'

在Python中, 索引被编码为从前面开始的偏移量,因此是从0开始:第一项在索引0,第二项在索引1,以此类推。

注意这里是如何将字符串赋值给名为S的变量的。稍后(特别是第6章)将深入研究这是如何工作的,但Python变量从不需要提前声明。当给变量赋值时,它就被创建,可能会被赋给任何类型的对象,并当它出现在表达式中时被它的值代替。在使用它的值之前,它必须已经被赋值了。就本章的目的而言,知道需要将一个对象赋值给一个变量以便之后使用它就足够了。

在Python中,还可以从末尾来后向索引——正索引是从左计数,而负索引是从右数回来:

>>> S[-1] # S末尾的最后一项
'm'
>>> S[-2] # 末尾末尾的倒数第二项
'a'

规范的说,负索引只是添加到字符串的长度上,所以下面两个操作是等价的(虽然第一个更容易编码且不容易搞错):

>>> S[-1] # S的最后一项
'm'
>>> S[len(S)-1] # 负索引——困难模式
'm'

注意在方括号中可以使用任意的表达式,而不仅是一个硬编码的数字字面量——在Python期待值的任何地方,可以使用字面量、变量或任何希望使用的表达式。Python的语法在这方面是完全通用的。

除了简单的位置索引,序列还支持一个被称为切片的形式更通用的索引,它是一步提取整个部分(切片)的一种方式。比如:

>>> S # 一个4字符的字符串
'Spam'
>>> S[1:3] # 从偏移量1到2提取S的一部分(没有3)
'pa'

理解切片的最简单的方式可能就是它们是从字符串中一步提取整列的一种方式。它们的通用形式,X[I:J],意味着“在X中从偏移量I直到偏移量J,但不包括J的一切。” 结果被返回到一个新对象中。比如,之前操作的第二个,在字符串S中从偏移量1到2(也就是,1到3-1)的所有字符作为一个新字符串。效果是切片或“解析出”中间的两个字符。

在一个提取中,左边界值(冒号左边)默认为0,右边界值(冒号右边)默认为被切片序列的长度。这导致了一些常见的用法变体:

>>> S[1:] # 从第一个开始的一切字符 (1:len(S))
'pam'
>>> S # S本身不变
'Spam'
>>> S[0:3] # 除了最后一个字符的一切字符
'Spa'
>>> S[:3] # 和 S[0:3] 一样
'Spa'
>>> S[:-1] # 也是除了最后一个字符的一切字符, 但更简单 (0:-1)
'Spa'
>>> S[:] # S中的所有作为一个顶层拷贝 (0:len(S))
'Spam'

注意在倒数第二个命令中,负偏移量是如何也能被用来给出切片的边界值的,并且最后一个操作是如何有效地拷贝整个字符串的。随后将学习:没有理由去拷贝一个字符串,但这个形式对列表这种序列很有用。

最后,作为序列,字符串也支持使用加号来连结(将两个字符串连接成一个新字符串)和重复(通过重复一个字符串创建一个新字符串):

>>> S
'Spam'
>>> S + 'xyz' # 连结
'Spamxyz'
>>> S # S 没有改变
'Spam'
>>> S * 8 # 重复
'SpamSpamSpamSpamSpamSpamSpamSpam'

注意加号(+)对不同的对象意外着不同的操作:对数字是加法,而对字符串是连结。这是一个Python通用属性,本书后面将称其为多态性——总之,操作符的含义取决于正在被操作的对象。当研究动态类型时,将看到:多态性是Python代码简洁和灵活的主要原因之一。因为类型不被限制,Python代码操作通常能自动操作许多不同类型的对象,只要它们支持兼容的接口(就像这里的 + 操作)。这个特性被证明是Python中的一个非常重要的概念;在随后的旅程中将更多学习它。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~