python中slice参数过长处理

很多小伙伴对于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,"slicestepcannotbezero");
return-1;
}
/*step的最小值,他是根据size_t来定义的
*#definePY_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,如果连续切片,数字和冒号都可以省略。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。