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 xlrd读取excel日期类型的2种方法
Apr 28 Python
Python中转换角度为弧度的radians()方法
May 18 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
Django异步任务之Celery的基本使用
Mar 23 Python
在django view中给form传入参数的例子
Jul 19 Python
Python 简单计算要求形状面积的实例
Jan 18 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
Python图片验证码降噪和8邻域降噪
Aug 30 Python
PyTorch中permute的使用方法
Apr 26 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
Python调用C语言开发的共享库方法实例
2015/03/18 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
Python内置函数locals和globals对比
2020/04/28 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
悦木之源美国官网:Origins美国
2016/08/01 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
设计毕业生简历中的自我评价
2013/10/01 职场文书
就业推荐表自我鉴定
2013/10/29 职场文书
保险专业自荐信范文
2014/02/20 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
新春寄语大全
2014/04/09 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS