首页IT科技python throw(python中slice参数过长处理)

python throw(python中slice参数过长处理)

时间2025-09-18 10:02:51分类IT科技浏览7144
导读:很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step、start 、stop。因为参数的值也是多变的,所以我们需要对它们进行下一步的处理。在之前的slice讲解中我们提到列表数据过长的问题,其中在参数中也有这样的问题存在。下面我们就step、start 、stop三个参数的分别处理展开讲解,帮大家...

很多小伙伴对于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                        ,如果连续切片        ,数字和冒号都可以省略                。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
手机能做的赚钱软件(手机做**什么赚钱软件-日常**,网上轻松实现零食自由——趣闲赚) windows无法连接到wifi怎么办(windows无法连接到wifi解决方法)