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

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

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

例如有以下高级应用:

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] 指向同一个字符,他们是等效的。

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

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

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 为空,则默认为字符串提取方向的最后

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

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,因此结果为:

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

小结

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

关于 Python 字符串切片的小领悟的更多相关文章

  1. Python字符串切片操作知识详解

    Python字符串切片操作知识详解 这篇文章主要介绍了Python中字符串切片操作 的相关资料,需要的朋友可以参考下 一:取字符串中第几个字符 print "Hello"[0] 表 ...

  2. DAY3(PYTHON)字符串切片

    字符串调整: capitalize()   #首字母大写 upper()        #全大写 lower()      #全小写 swapcase() #大小写翻转 字符串切片: 顾头不顾尾!!! ...

  3. Python字符串切片

    1.字符串切片:从字符串中取出相应的元素,重新组成一个新的字符串 语法: 字符串[    开始元素下标  :  结束元素下标  :  步长     ]   # 字符串的每个元素都有正负两种下标 步长: ...

  4. Python 字符串切片

    #-*- coding:utf-8 -*- #字符串切片 names = "abcdefgh" ''' 切片语法 names[起始位置:终止位置:步长] 起始位置:即字符串的下标, ...

  5. python 字符串 切片

    ####################概念######################''' int 整数 str 字符串 一般不存放大量的数据 bool 布尔值,用来判断. True,False ...

  6. python字符串和列表小案例

    python 目录 python 一.字符串 1.给定一个字符串,利用切片将字符串反转 2.给定一个字符串,将空格替换为逗号 3.给定一个字符串,大写改为小写 4.str = '' ,li = ['l ...

  7. python 字符串切片知识巩固

    切片操作(slice)可以从一个字符串中获取子字符串(字符串的一部分).我们使用一对方括号.起始偏移量start.终止偏移量end 以及可选的步长step 来定义一个分片. 格式: [start:en ...

  8. Python 字符串切片(slice)

    切片操作(slice)可以从一个字符串中获取子字符串(字符串的一部分).我们使用一对方括号.起始偏移量start.终止偏移量end 以及可选的步长step 来定义一个分片. 格式: [start:en ...

  9. [编程基础] Python字符串替换笔记

    Python字符串替换笔记 Python字符串替换笔记主要展示了如何在Python中替换字符串.Python中有以下几种替换字符串的方法,本文主要介绍前三种. replace方法(常用) transl ...

  10. python学习第四天 --字符编码 与格式化及其字符串切片

    字符编码 与格式化 第三天已经知道了字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采 ...

随机推荐

  1. 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?

    2023-07-01:redis过期策略都有哪些?LRU 算法知道吗? 答案2023-07-01: 缓存淘汰算法(过期策略) 当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换 ...

  2. C++面试八股文:技术勘误

    不知不觉,<C++面试八股文>已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉. 为了不误导更多的小伙伴,以后会不定期的出勘误文章,请 ...

  3. 如何在docker中创建postgresql数据库并使用prisma进行连接

    在docker中创建postgresql # docker 创建 postgres docker pull postgres # 创建容器 # ~/study/db/postgres 是本地的文件映射 ...

  4. .NET EF查询需要注意的点

    记录下在公司中混乱使用跟踪和非跟踪查询的坑. var blog = context.Blogs.Single(b => b.BlogId == 1); // 查询时放回一条 如果存在多条引发异常 ...

  5. 【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析

    前言 在进行性能测试时,我们需要对测试结果进行监控和分析,以便于及时发现问题并进行优化. Locust在内存中维护了一个时间序列数据结构,用于存储每个事件的统计信息. 这个数据结构允许我们在Chart ...

  6. 求任意两个正整数的最大公约数(GCD)。

    问题描述 求任意两个正整数的最大公约数(GCD). 问题分析 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数.几个自然数公有的约数,叫做这几个自然数的公约数.公约数中最大的一个公约 ...

  7. 修改docker容器端口映射

    原文地址 操作步骤如下 关闭docker systemctl stop dokcer 修改配置文件 位置一般是: /var/lib/docker/containers/containerId/host ...

  8. hadoop 启动增加DEBUG信息

    export HADOOP_ROOT_LOGGER=DEBUG,console

  9. 【技术积累】Linux中的命令行【理论篇】【一】

    7z命令 命令介绍 7z命令是Linux系统中的一个压缩和解压缩工具,它可以用来创建.压缩和解压缩7z格式的文件.7z是一种高压缩率的文件格式,通常比其他常见的压缩格式(如zip和gzip)具有更高的 ...

  10. Django:django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported.

    from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/' ...