为了丰富学员们的课外知识,老师让我们助理分享这套Python系列教程。由于Python教程并非老师所写,所以不如老师的AI教学风趣幽默,望大家见谅!想要学习AI技术的新朋友可以去www.captainbed.net。本公众号由助理负责运营,只免费分享课外知识,不回复任何私信。


本篇文章我们来开始讲解一下字符串。


就像任意字符的集合一样,字符串是用来记录文本信息的。它们是在Python中作为序列提到的第一个例子。序列是一个包含了其他对象的有序集合。序列中的元素包含了一个从左到右的顺序——序列中的元素根据它们的相对位置进行存储和读取。从严格意义上来说,字符串是单个字符组成的序列,其他类型的序列还包括列表和元组。


作为序列,字符串其中各个元素是有固定位置顺序的。也就是说可以通过位置来获取或操作某个元素。例如,如果我们有一个含有四个字符的字符串,我们可以通过内置的len函数验证其长度并通过索引操作得到其各个元素。



.>>> S = 'Spam'


.>>> len(S)  # Length


4


.>>> S[0]  # The first item in S,indexing by zero-based position


'S'


.>>> S[1]  # The second item from the left


'p'


在Python中,索引是按照从最前面的偏移量进行编码的,也就是从0开始,第一项元素的索引为0,第二项索引为1,依此类推。


注意我们在这里是直接把字符串赋给一个名为S的变量的——因为Python变量不需要提前声明。在Python中,当给一个变量赋值的时候就创建了它,可能赋的是任何类型的对象,并且当变量出现在一个表达式中的时候,就会用其值替换它。


在Python中,我们还能够反向索引,从最后一个开始(正向索引是从左边开始计算,反向索引是从右边开始计算)。



.>>> S[-1]  # The last item from the end in S


'm'


.>>> S[-2]  # The second to last item from the end


'a'


一般来说,负的索引号会简单地与字符串的长度相加,因此,以下两个操作是等效的(尽管第一个要更容易编写并不容易发生错误):



.>>> S[-1]        # The last item in S


'm'


.>>> S[len(S)-1]  # Negative indexing,the hard way


'm'


值得注意的是,我们能够在方括号中使用任意表达式,而不仅仅是使用数字常量——我们可以使用一个常量、一个变量或任意表达式。


除了简单地从位置进行索引,序列也支持一种所谓分片(slice)的操作,这是一种一步就能够提取整个分片(slice)的方法。例如:



.>>> S       # A 4-character string


'Spam'


.>>> S[1:3]  # Slice of S from offsets 1 through 2 (not 3)


'pa'


也许认识分片的最简单的办法就是把它们看做是从一个字符串中一步就提取出一部分的方法。它们的一般形式为X[I:J],表示“取出在X中从偏移量为I,直到但不包括偏移量为J的内容”。结果就是返回一个新的对象。例如,上边的最后一个操作,是在字符串S中将从偏移1到2的所有字符取出作为一个新的字符串返回。效果就是切片或“分离出”中间的两个字符。


在一个分片中,左边界默认为0,并且右边界默认为分片序列的长度。下面是一些有趣的用法:



.>>> S[1:]       # Everything past the first (1:len(S))


'pam'


.>>> S           # S itself hasn't changed


'Spam'


.>>> S[0:3]      # Everything but the last


'Spa'


.>>> S[:3]       # Same as S[0:3]


'Spa'


.>>> S[:-1]      # Everything but the last again,but simpler (0:-1)


'Spa'


.>>> S[:]        # All of S as a top-level copy (0:len(S))


'Spam'


作为一个序列,字符串也支持使用加号进行合并(将两个字符串合成为一个新的字符串),或者重复(通过再重复一次创建一个新的字符串):



.>>> S


Spam'


.>>> S + 'xyz'   # Concatenation


'Spamxyz'


.>>> S           # S is unchanged


'Spam'


.>>> S * 8       # Repetition


'SpamSpamSpamSpamSpamSpamSpamSpam'


注意加号(+)对于不同的对象有不同的意义:对于数字为加法,对于字符串为合并。这是Python的一般特性,也就是我们将会在后面学到的多态。简而言之,一个操作的意义取决于被操作的对象。正如将在学习动态类型时看到的那样,这种多态的特性给Python代码带来了很大的简洁性和灵活性。由于类型并不受约束,Python编写的操作通常可以自动地适用于不同类型的对象。