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线程锁(thread)学习示例
Dec 04 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
Python使用re模块正则提取字符串中括号内的内容示例
Jun 01 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
Python实现银行账户资金交易管理系统
Jan 03 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
python代码实现猜拳小游戏
Nov 30 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 24 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中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
Aptana调试javascript图解教程
2009/11/30 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
python实现四人制扑克牌游戏
2020/04/22 Python
python集合能干吗
2020/07/19 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
岗位竞聘演讲稿
2014/01/10 职场文书
1亿有多大教学反思
2014/05/01 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
校园开放日新闻稿
2015/07/17 职场文书
学困生转化工作总结
2015/08/13 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android