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深入学习之闭包
Aug 31 Python
Python 的 Socket 编程
Mar 24 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
python监控文件或目录变化
Jun 07 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python实现蒙特卡罗方法教程
Jan 28 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
python中return不返回值的问题解析
Jul 22 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
PHP异常处理Exception类
2015/12/11 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
在Django的模板中使用认证数据的方法
2015/07/23 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Django权限机制实现代码详解
2018/02/05 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
Python中文件的读取和写入操作
2018/04/27 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
Python接收手机短信的代码整理
2020/08/02 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
三年级科学教学反思
2014/01/29 职场文书
西式婚礼主持词
2014/03/13 职场文书