在上一篇《手把手陪您学Python》7——字符串的索引中,我们初步了解了字符串的位置索引方法。之所以把索引和切片分开两篇写,上一篇也说了,是为了把切片的方式和规则能够讲的更清楚,有助于我们应对未来在不同的数据结构上,应对更复杂的切片方式。
简单来说,一个索引对应的是一个内容(字母、数字、符号等),而切片对应的则是一段内容。
与索引的单一位置表示不同,切片有一个基本的语法表达式:
object[start_index:end_index:step]
这个object,可以是我们正在讲的字符串,也可以是我们以后要讲到的列表、数组、DataFrame等等。从这就可以看出来,他们的切片方式是一样的,所以一定要把基本功学扎实。
star_index和end_index代表着切片的起点和重点,与我们上一篇说到的从左往右数和从右往左数,并不完全相同,具有高的灵活性。需要特别强调的是,end_index是不包括在内的,类似数学中左闭右开的概念。
例如,str[0:5],代表的是字符串从左往右数第0、1、2、3、4,一共5个位置对应的内容,但是不包括end_index为5这个位置对应的内容。
在此处还有一个规则,就是遇到包含头或者包含尾的切片时,头尾的索引位置可以忽略不写,那么str[0:5]就可以写为str[:5],str[-10:-1]就可以写为str[:-1]。
但是str[-5:-1]和str[-5:]是不一样的,前者是不包括-1这个位置的,但是后者是包括的,也就是一直到字符串的最后一个字符(后面有示例)。
聪明如你,如果要把整个字符串都选上,就可以写成str[:]了。
step是切片时每个取样的间隔步长,也就是每多少个值取一个值,默认是1。当我们不输入这个参数的时候,都是按照从左往右每一个值取一个值,也就是连续取值的意思。
step参数对于切片来说非常重要,因为它不仅决定了取值的步长,还决定了取值的方向。
当step为正数时,切片是从左往右取值的,同时也就要求star_index和end_index的位置也是从左到右的,也就是起点位置要在终点位置的左边。
当step为负数时,切片是从右往左取值的,同时也就要求star_index和end_index的位置也是从右到左的,也就是起点位置要在终点位置的右边。
无论位置索引是正数还是负数,甚至是正负数混合的,只要让起点位置、终点位置、步长的正负值,满足上面的要求就可以。
如果不满足,虽然不会报错,但是会返回空字符串。
为了更直观地说明上述规则,画了下面这张示例图,并用一个字符串进行举例,对上面比较晦涩的定义进行解释。
考虑这个最简单的字符串,str = '0123456789'。它的值和从左往右的位置索引是一样的,可以让我们更清楚地看到切片结果。
当step=1时:(默认值,可以写出来也可以不写出来,这里按照惯例不写出来)
In [1]: str = '0123456789'
In [2]: str[0:5] # 起点、终点均为正值
Out[2]: '01234'
In [3]: str[-5:-1] # 起点、终点均为负值
Out[3]: '5678'
In [4]: str[-5:] # 起点为负值,终点省略,可以取到字符串最后一个值
Out[4]: '56789'
In [5]: str[2:-6] # 起点为正值,终点为负值
Out[5]: '23'
In [6]: str[-8:6] # 起点为负值,终点为正值
Out[6]: '2345'
In [7]: str[8:3] # 起点在终点右侧
Out[7]: ''
In [8]: str[-2:-8] # 起点在终点右侧
Out[8]: ''
In [9]: str[8:-10] # 起点在终点右侧
Out[9]: ''
In [10]: str[-1:8] # 起点在终点右侧
Out[10]: ''
In [11]: str[-1:9] # 起点和终点一个位置,但终点不包括在内
Out[11]: ''
当step=-1时:
In [12]: str[8:3:-1] # 起点、终点均为正值
Out[12]:'87654'
In [13]: str[-2:-8:-1] # 起点、终点均为负值
Out[13]:'876543'
In [14]: str[8:-10:-1] # 起点为正值,终点为负值
Out[14]: '87654321'
In [15]: str[8::-1] # 起点为正值,终点省略,可以取到字符串第一个值
Out[15]: '876543210'
In [16]: str[-1:8:-1] # 起点为负值,终点为正值
Out[16]: '9'
In [17]: str[0:5:-1] # 起点在终点左侧
Out[17]: ''
In [18]: str[-5:-1:-1] # 起点在终点左侧
Out[18]: ''
In [19]: str[2:-6:-1] # 起点在终点左侧
Out[19]: ''
In [20]: str[-8:6:-1] # 起点在终点左侧
Out[20]: ''
In [21]: str[-1:9:-1] # 起点和终点一个位置,但终点不包括在内
Out[21]: ''
上面用20条语句遍历了起点、终点和步长的不同正负号的组合情况,以及最终的结果。
每条语句后的“#”是注释符,是为了说明语句的含义,不会对运行造成影响。
可能最开始看到会觉得有点晕,请大家耐心地逐一验证,如果还有其他在上例中没有涉及到的情景,也请大家自己进行测试。
如果大家能够靠自己计算,能得到同样正确的结果,那么恭喜大家,说明大家这部分的知识就已经很扎实了,足以能够很好地应对后面将会学到或者遇到的任何情景了。
上面的示例讲的都是连续切片的情况,也就是step=1或者-1。如果改变step的值,就可以实现不连续切片了。
In [22]: str[0:5:2]
Out[22]: '024'
In [23]: str[-5:0:-3]
Out[23]: '52'
到这里,字符串的切片也讲完了,可能这是我们学习Python以来,遇到的第一个比较绕的主题,但概念应该并不复杂,只要大家能够耐心自己算几次就会很熟悉了。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
欢迎扫描下方二维码,关注“亦说Python”公众号,阅读《手把手陪您学Python》系列文章的其他篇目,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手8”,即可免费下载本篇文章所用示例语句。