关于 Python 字符串切片的小领悟

1. 什么是 Python 字符串切片?

例如存在字符串 str2 = "abcd1234" ,有以下简单的切片应用。

Python 复制代码
str2[0] # a
str2[0:3] # abc
str2[0:6:2] # ac1

有 3 种形式的切片:

  1. string[index]: 获取字符串特定下标字符
  2. string[start, stop]: 获取从 start 坐标到 stop 坐标的字符串,注意左闭右开,既 [start, stop) 范围坐标的字符串
  3. string[start, stop, step]: 获取从 start 坐标到 stop 坐标的字符串,且一次提取间隔为 step

上面都是一些基础的应用,在此之上,还有高级的特性:

  1. 坐标为空则默认(提取方向的)开头或者结尾,步级(step)为空则默认为1
  2. 不管是坐标还是步级(step),都支持正负数

例如有以下高级应用:

Python 复制代码
str2[1::2] # bd24
str2[:-1:1] # abcd123

特性1 比较好理解,但特性2 的存在让字符串切片存在更多的玩法,但也让切片更难理解。

小领悟就是关于怎么理解这高级的切片功能,让我们看着代码就可以知道其切片结果。

2. 切片的理解

2.1 切片的基础概念

以最复杂最完整的第三种切片方法 string[start, stop, step] 为例,start,stop 划定了切片的范围,如下图:

step 确定了在范围内 挑选 的跨度,以 step = 2 为例,如下图:

2.1 坐标正负的含义

如上图所示,

  1. 以正数表示坐标,则坐标是从左到右,从 0 开始计数
  2. 以负数表示坐标,则坐标是从右到左,从 -1 开始计数
  3. 0 不分正负,不管正坐标还是负坐标,都规定 0 恒指向左边第一个元素

因此字符串中每一个元素都至少有2个坐标可以表示 。以字符 d 为例,其坐标既可以是 3,也可以是 -5,因此 str2[3]str2[-5] 指向同一个字符,他们是等效的。

Python 复制代码
print(str2[3] is str2[-5]) # True

这个等效的概念很重要,正因为这个概念,start、stop 可以是正负任意的组合,例如:

Python 复制代码
str2[2:5] # cd1
str2[-6:-3] # cd1
str2[-6:5] # cd1
str2[2:-3] # cd1

上面的 4 中写法是完全等效的,不管 start 是 2 还是 -6 都指向 'c',不管 stop 是 5 还是 -3 都指向 '2'。

2.2 步级正负的含义

在一定的条件下,我们可以理解为 start + step 就是下一个切片的元素坐标。

str2[1:6:2] 为例,如下图:

为什么是一定条件下才成立呢?例如切片:str2[-7:6:2],如果按 start + step 的计算,[-7, 6) 之间的坐标数据全乱了。

  • 正确坐标:1,3,5
  • 错误坐标:-7, -5, -3, -1, 1, 3,5

所以,如果按 start + step 的计算前提,应该是 start 和 stop 坐标 同为正数或者负数,同样以 str2[-7:6:2] 为例,坐标 -7 元素对应的正坐标是 1,等效于 str2[1:6:2],或者 str2[-7:-2:2],此时通过 start + step 的计算可以获取正确的切片提取坐标。

总的来说:正的步级表示从左往右,负的步级表示从右往左,从 start 到 stop 按步级正负指定的方向提取

2.3 特殊切片结果的理解

基于上面的理解,同样以 str2 = "abcd1234" 为例,我们试着分析以下的切片。

2.3.1 str2[::-1]

  1. 步级为负数,表示提取方向从右到左
  2. 步级为1,表示每跨步1个元素提取
  3. start 为空,则默认为字符串提取方向的最开始
  4. end 为空,则默认为字符串提取方向的最后

因此最终结果如下,起到个倒序的效果:

Python 复制代码
print(str2[::-1]) # 4321dcba

2.3.2 str2[0:6:-1]

  1. 步级为负数,表示提取方向从右到左
  2. 步级为1,表示每跨步1个元素提取
  3. start 为 0,stop 为 6

start 元素在 stop 元素的左边,但提取方向却是从右到左,无法切片,因此最终结果为空字符串。

这样 [0:6:-1] 的写法当然是不合理的,这只是在我尝试理解切片过程中随机做的一些实验

2.3.3 str2[2:-1:2]

  1. 步级为正数,表示提取方向从左到右
  2. 步级为2,表示每跨步2个元素提取
  3. start为2,从元素 'c' 开始
  4. stop 为-1,表示元素'4',用正数表示坐标则为 7

转换后坐标从 [2, 7),步级为2,因此结果为:

Python 复制代码
print(str2[2:-1:2]) # c13

小结

只是一点小小理解和领悟,就不特意总结了,各位看官自己理解即可。

相关推荐
数据智能老司机几秒前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机几秒前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 分钟前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i11 分钟前
drf初步梳理
python·django
每日AI新事件11 分钟前
python的异步函数
python
这里有鱼汤1 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook10 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室11 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三12 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
用户25191624271116 小时前
Python之语言特点
python