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获取当前计算机cpu数量的方法
Apr 18 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
简述 Python 的类和对象
Aug 21 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
javascript StringBuilder类实现
2008/12/22 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
koa-router源码学习小结
2018/09/07 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
个人应聘自我评价分享
2013/11/18 职场文书
村委会贫困证明
2014/01/14 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
个人课题方案
2014/05/08 职场文书
公司借条范本
2015/05/25 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
导游词之介休绵山
2019/12/31 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript