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实现的二维码生成小软件
Jul 11 Python
Python函数式编程
Jul 20 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
python自动12306抢票软件实现代码
Feb 24 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
python 提取key 为中文的json 串方法
Dec 31 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
TensorBoard 计算图的查看方式
Feb 15 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
详解分布式系统中如何用python实现Paxos
May 18 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 芝麻信用接入的注意事项
2016/12/01 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
Python获取服务器信息的最简单实现方法
2015/03/05 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Python2与Python3的区别详解
2020/02/09 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
生产车间班组长岗位职责
2014/01/06 职场文书
财务支持类个人的自我评价
2014/02/14 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
反邪教观后感
2015/06/11 职场文书
《去年的树》教学反思
2016/02/18 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang