在上一篇《手把手陪您学Python》6——字符串的标识中,我们初步了解了字符串的标识方法,以及特殊的转义字符用法。下面我们将学习字符串的一个非常重要的特性——索引和切片。
理解字符串的索引原则和切片方法,不仅是字符串操作的核心,也对我们未来学习列表以及其他更复杂的数据结构的索引和切片有很大帮助。
因为我们在对字符串进行索引和切片时,一般不会直接对字符串进行操作,而是先把字符串赋值给一个变量,对这个变量进行索引和切片操作。
所以,在介绍字符串前,我们先简单了解一下变量的概念。
变量,顾名思义,就是可以变化的量,或者说是可以变化的值。其对应的就是常量,也就是固定不变的值,比如一个数字、一个字符串、圆周率等等,都是常量,他们的值不会因为程序的运行而变化。
而变量就不同了,随着程序的运行,变量的值会不断发生变化。这种变化,既可能是人为赋值的变化,比如先让a等于1,再让a代表2,也可能是程序运行的需要,比如在循环中,让a的值自动变化等等。
总之,变量的值是可以变化的。
而让其变化的最简单的方式就是赋值,赋值符号是“=”。“=”的左边是变量名,右边是给变量赋的值。比如:a = 1,b = 5,c = 'abc',d = 'Hello World!'。(在编写代码时,约定俗成的习惯是在“=”的两边都各放一个空格)
因为已经给变量赋值了,所以当我们打印Hello World!时,既可以写成print('Hello World!'),也可以写成print(d)。
注意,这里的d是不加引号的,否则就变成了字符串'd'了,也就不是代表'Hello World!'的变量d了。
知道了变量的概念,就可以开始对字符串进行索引和切片操作了。
一会儿大家就能看到,其实索引和切片的概念和方法都不难,甚至可以说很简单。但如果真的要把规则抠细,能够把不同变化情况下的结果都准确判断出来,却需要我们能够深刻了解索引和切片的规则,特别是对于切片来说,更是如此。
为了能够把这部分基础但又非常重要的内容讲清楚,把不同情况的示例演示清楚,会把索引和切片分成两篇文章来写。
这一篇先来了解一下索引。
所谓“索引”,大家可以先将它理解为书的目录。对字符串索引特定的位置和这个位置对应的内容,就像通过目录去寻找书的页码以及这个页码对应的内容一样。
不过这其中有两个区别,一是书的目录是从第一页标记页码的,而字符串是从第0个位置开始的。二是书的目录只有从1开始的一个方向的页码顺序,而字符串除了可以从前面的0开始,还可以从最后的-1开始。
从下图中,大家可以直观地看到字符串中每个字符的位置以及编码方式。
有了这张图的基础,接下来的步骤就非常容易了。
In [1]: str = 'Hello World!'
In [2]: str[0]
Out[2]: 'H'
In [3]: str[-1]
Out[3]: '!'
从上面的示例中,大家就可以看到,索引就是按照字符串的位置编码,去寻找位置编码对应内容的过程。这个编码既可以使用从左往右数的正数编码(包括0),也可以选择从右往左数的负数编码,这主要取决于编写代码的目的。
In [4]:str[0].lower()
Out[4]:'h'
In [5]:str[-12].lower()
Out[5]:'h'
比如我要将句首的大写字母改为小写字母,就需要使用从左往右数的位置0。当然如果字符串比较短,使用从右往左数的位置-12也可以达到同样的效果,但是一般不会这么去做。
这里说明一下,有时为了示例方便,可能会使用一些还没有涉及到的内容,一方面我会尽量避免这种情况的发生,另一方面会对这部分内容加以解释,如果有实在理解不了的地方也没有关系,在以后的文章中,都会有更详细的说明。
这里的lower(),就是将对应字符变成小写的意思。
另外,大家可能会看到,前面的两个示例都没有使用print()函数。这是因为在Jupyter Notebook中,可以直接输出运行的结果,而不需要每次打印,但输出的结果会有所区别。
比如上面的例子,如果使用print()函数的话,输出结果h就不包括前后两个单引号''。
In [6]: print(str[0].lower())
Out[6]: h
这是因为,和上一篇所讲的一样,单引号、双引号或者三引号都是字符串的标识符,不是字符串的一个部分,不具有真实的意思,所以不会被打印出来。
如果不是特别有必要,为了程序的简洁和结果的直观,在后面的示例中,都默认不使用print()函数打印结果。
继续上面索引的列子。
虽然我们刚才把句首的大写字母改成了小写字母,但并不是将字符串‘Hello World!’中的首字母改成了小写,只是将取出来的第0个位置的‘H’改成了小写‘h’。可以通过下面的代码验证:
In [7]: str
Out[7]: 'Hello World!'
字符串本身并没有被修改,这是因为字符串是常量,是不可变的!
如果要将结尾的“!”改为“.”,可以使用从右往左数的-1位置,或者从左往右数的11位置,但结果大家应该已经知道了,会报错的。
In [8]: str[-1] = '.'
Out[8]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-cba0631dd81c> in <module>
----> 1 str[-1] = '.'
TypeError: 'str' object does not support item assignment
In[9]: str[11] = '.'
Out[9]: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-c89a1731b99d> in <module>
----> 1 str[11] = '.'
TypeError: 'str' object does not support item assignment
以上就是字符串索引的全部内容了,重点就是要了解字符串索引位置的表示方法。
在下一篇中,我们将了解一下字符串的切片方法。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
欢迎扫描下方二维码,关注“亦说Python”公众号,阅读《手把手陪您学Python》系列文章的其他篇目,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手7”,即可免费下载本篇文章所用示例语句。