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


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

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

    Copy
    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),都支持正负数

    例如有以下高级应用:

    Copy
    str2[1::2] # bd24 str2[:-1:1] # abcd123

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

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

    2. 切片的理解#

    2.1 切片的基础概念#

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

    image

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

    image

    2.1 坐标正负的含义#

    image

    如上图所示,

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

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

    Copy
    print(str2[3] is str2[-5]) # True

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

    Copy
    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] 为例,如下图:

    image

    为什么是一定条件下才成立呢?例如切片: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]#

    image

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

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

    Copy
    print(str2[::-1]) # 4321dcba

    2.3.2 str2[0:6:-1]#

    image

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

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

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

    2.3.3 str2[2:-1:2]#

    image

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

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

    Copy
    print(str2[2:-1:2]) # c13

    小结#

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

  • 相关阅读:
    神经网络中的权重和偏置初始化
    Visual Studio Code编辑器设置字号和行间距详细步骤
    cubeIDE开发, stm32的OLED点亮及字符显示设计(基于SPI通信)
    C++ stack queue模拟实现
    Tiktok 网络、网络
    网页制作课作业简单的学生网页作业源码 基于html css javascript jquery仿慕课网教学培训网站设计实例 企业网站制作
    bash shell 无法使用 perl 正则
    学生抗疫HTML网页设计作品 学生疫情网页模板 大学生抗疫感动专题网页设计作业 HTML学生抗疫网站作业设计
    java泛型
    【Python】【Pyinstaller】打包过程问题记录及解决
  • 原文地址:https://www.cnblogs.com/gmpy/p/17777746.html