python中slice参数过长的处理方法及实例


Posted in Python onDecember 15, 2020

很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step 、start 、stop 。因为参数的值也是多变的,所以我们需要对它们进行下一步的处理。在之前的slice讲解中我们提到列表数据过长的问题,其中在参数中也有这样的问题存在。下面我们就step 、start 、stop 三个参数的分别处理展开讲解,帮大家深入了解slice中的参数问题。

1.step 的处理

if (r->step == Py_None) {
     /* step 默认是 1,这不难理解 */
   *step = 1;
 } else {
   if (!_PyEval_SliceIndex(r->step, step)) return -1;
     /* step 不能为零,否则报 ValueError,要注意的是,这个异常是在执行 BINARY_SUBSCR 才报出来,
    * 在创建 slice 对象时如果 step 为 0 并不会报错 */
   if (*step == 0) {
     PyErr_SetString(PyExc_ValueError, "slice step cannot be zero");
     return -1;
   }
   /* step 的最小值,他是根据 size_t 来定义的
    * #define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
    * 所以在 32 为系统上就是 -2147483647 */
   if (*step < -PY_SSIZE_T_MAX)
     *step = -PY_SSIZE_T_MAX;
 }

2.start 的处理

/* 当 start 未设置时的默认值,length 是序列的长度
  * 如果切片从序列头部开始(step > 0),start = 0
  * 如果切片从序列末尾开始(step < 0),start = length - 1 */
 defstart = *step < 0 ? length-1 : 0;
 if (r->start == Py_None) {
   *start = defstart;
 }
 else {
   if (!_PyEval_SliceIndex(r->start, start)) return -1;
   /* 如果 start 是负数,其实是通过加上序列长度转化成正数的 a[-1:] <=> a[4:] */
   if (*start < 0) *start += length;
   /* 如果加上 length 还是小于 0,也就是 -start 超出了序列长度,这时候会根据 step 的正负将start
    * 设置为序列的开始(0)或结束(-1)位置
    * a[-6:-1]  <=> a[0:-1]
    * a[-6:-1:-1] <=> a[-1:-1:-1] */
   if (*start < 0) *start = (*step < 0) ? -1 : 0;
    /* start 超出了序列长度,这时候会根据 step 的正负将start
    * 设置为序列的长度或序列长度减 1(最后一个元素)
    * a[6:-1]  <=> a[5:-1]
    * a[6:-1:-1] <=> a[4:-1:-1] */
   if (*start >= length)
     *start = (*step < 0) ? length - 1 : length;
 }

3.stop 的处理

/* 当 stop 未设置时的默认值,length 是序列的长度
  * 如果切片从序列头部开始(step > 0),stop = length,比最后一个元素的下标多 1
  * 如果切片从序列末尾开始(step < 0),start = -1,比第一个元素的下标少 1 */
 defstop = *step < 0 ? -1 : length;
 if (r->stop == Py_None) {
   *stop = defstop;
 } else {
   if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
   /* 如果 stop 是负数,其实是通过加上序列长度转化成正数的 a[:-1] <=> a[:4] */
   if (*stop < 0) *stop += length;
   /* 如果加上 length 还是小于 0,也就是 -stop 超出了序列长度,这时候会根据 step 的正负将 stop
    * 设置为序列的开始(0)或结束(-1)位置
    * a[3:-6]  <=> a[3:0]
    * a[3:-6:-1] <=> a[3::-1] */
   if (*stop < 0) *stop = (*step < 0) ? -1 : 0;
   if (*stop >= length)
     *stop = (*step < 0) ? length - 1 : length;
 }

注意:

  • 指定的区间是左开右闭型
  • 从头开始,开始索引数字可以省略,冒号不能省略
  • 到末尾结束,结束索引数字可以省略,冒号不能省略。
  • 步长默认为1,如果连续切片,数字和冒号都可以省略。

关于Python中的slice操作扩展:

Python中slice操作的完整语法:

# i默认是0
# j默认是len(S)
# k的步长,默认为+1
S[i:j:k]

其中i,j,k都可以是负数:

若i < 0或者k<0,等价于len(S) + i,或者len(S) + j;

若k < 0,则表示将[i,k)之间的字符按照步长k,从右往左数,而不是从左往右数

>>>S = 'abcdefg'
>>>S[-3:-1]
'ef'

>>>S[-1:-3:-1]  # 将位于S[-1:-3]的字符子串,按照步长1,从右往左数,而不是从左往右数
'gf'

>>>S[4:2:-1]
'ed'

>>>S[2:4:-1]  # 输出空字符串
''

>>>S[::-1]  # 逆序
'gfedcba'

需要指出的是s[i:j:k]的形式,等价于下面的形式:

>>>S = 'abcdefg'
>>>S[slice(None, None, -1)]  # 等价于使用slice对象进行数组元素的访问操作
'gfedcba'

到此这篇关于python中slice参数过长的处理方法及实例的文章就介绍到这了,更多相关python中slice参数过长如何处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python控制台英汉汉英电子词典
Apr 23 Python
Python正则表达式匹配ip地址实例
Oct 09 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
对pandas中to_dict的用法详解
Jun 05 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
Python3实现建造者模式的示例代码
Jun 28 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
Python 可迭代对象 iterable的具体使用
Aug 07 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 #Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 #Python
详解python中的异常捕获
Dec 15 #Python
python 6种方法实现单例模式
Dec 15 #Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 #Python
Python爬虫开发与项目实战
Dec 16 #Python
python中reload重载实例用法
Dec 15 #Python
You might like
PHP与已存在的Java应用程序集成
2006/10/09 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php简单smarty入门程序实例
2015/06/11 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python训练数据时打乱训练数据与标签的两种方法小结
2018/11/08 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
Python Process多进程实现过程
2019/10/22 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
幼师自荐信范文
2013/10/06 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
市场策划求职信
2014/08/07 职场文书
新员工入职欢迎词
2015/01/23 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
协议书格式模板
2016/03/24 职场文书