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下如何让web元素的生成更简单的分析
Jul 17 Python
python paramiko实现ssh远程访问的方法
Dec 03 Python
python实现根据月份和日期得到星座的方法
Mar 27 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
python实现神经网络感知器算法
Dec 20 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
教你怎么用python实现字符串转日期
May 24 Python
Python实现socket库网络通信套接字
Jun 04 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上的memcache和memcached两个pecl库
2010/03/29 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
JS重要知识点小结
2011/11/06 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
python如何写出表白程序
2020/06/01 Python
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
农村党支部先进事迹
2014/01/14 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
高中军训感言400字
2014/02/24 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python
解析MySQL binlog
2021/06/11 MySQL
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
CSS基础详解
2021/10/16 HTML / CSS