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爬取网站数据保存使用的方法
Nov 20 Python
python实现DES加密解密方法实例详解
Jun 30 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
Python格式化日期时间操作示例
Jun 28 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
对python制作自己的数据集实例讲解
Dec 12 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
Python迭代器协议及for循环工作机制详解
Jul 14 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
最省空间的计数器
2006/10/09 PHP
php多任务程序实例解析
2014/07/19 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JavaScript的目的分析
2007/01/05 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
Python时间获取及转换知识汇总
2017/01/11 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Python中常见的异常总结
2018/02/20 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
Python闭包函数定义与用法分析
2018/07/20 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
汽车运用工程毕业生自荐信
2013/10/29 职场文书
全陪导游欢迎词
2014/01/17 职场文书
小学生手册家长评语
2014/04/16 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
跳高加油稿
2015/07/21 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
2016大学军训心得体会
2016/01/11 职场文书
Python面向对象编程之类的概念
2021/11/01 Python