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中处理unchecked未捕获异常实例
Jan 17 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 Python
python+opencv实现动态物体追踪
Jan 09 Python
python如何读写csv数据
Mar 21 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
Python计算IV值的示例讲解
Feb 28 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 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性能优化准备篇图解PEAR安装
2011/12/05 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
重新认识php array_merge函数
2014/08/31 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
一些PHP的面试题
2015/05/06 面试题
优秀家长事迹材料
2014/05/17 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
上班旷工检讨书
2015/08/15 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技