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常用列表数据结构小结
Aug 06 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
对Python中的@classmethod用法详解
Apr 21 Python
python 读取DICOM头文件的实例
May 07 Python
python实现对输入的密文加密
Mar 20 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
Python如何输出整数
Jun 07 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
Python OpenCV实现图像模板匹配详解
Apr 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 程序员应该使用的10个组件
2009/10/31 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
js图片无缝滚动插件使用详解
2020/05/26 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python实现ping指定IP的示例
2018/06/04 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
python实现弹窗祝福效果
2019/04/07 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
如何使用Pytorch搭建模型
2020/10/26 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
.NET方向面试题
2014/11/20 面试题
财务会计自荐信范文
2014/02/21 职场文书
售后服务承诺书范文
2014/03/26 职场文书
班级团队活动方案
2014/08/14 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
校运会广播稿
2015/08/19 职场文书
MySQL三种方式实现递归查询
2022/04/18 MySQL
MySQL sql模式设置引起的问题
2022/05/15 MySQL