python 外部参数过长_介绍python中slice参数过长的处理方法及实例
python教程栏目介绍slice参数过长的处理方法
很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step 、start 、stop 。因为参数的值也是多变的,所以我们需要对它们进行下一步的处理。在之前的slice讲解中我们提到列表数据过长的问题,其中在参数中也有这样的问题存在。下面我们就step 、start 、stop 三个参数的分别处理展开讲解,帮大家深入了解slice中的参数问题。
相关免费学习推荐:python教程(视频)
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 外部参数过长_介绍python中slice参数过长的处理方法及实例相关推荐
- python的六个类型_介绍Python中6个序列的内置类型
原标题:介绍Python中6个序列的内置类型 1.Python中6个序列的内置类型分别是什么? Python包含6中内建的序列,即列表.元组.字符串.Unicode字符串.buffer对象和 xran ...
- python request对四类参数的处理_如何处理Djang中同一参数具有多个变量的request.GET...
在Django视图中,您可以访问request.GET['variablename'],因此在您的视图中,您可以执行如下操作:myvar = request.GET['myvar'] 实际的reque ...
- python mat函数的作用_介绍python的matplotlib常用绘图函数
免费学习推荐:python视频教程 matplotlib具有强大的绘图功能,但是语句琐碎,每次使用都需要一句一句书写未免太过麻烦.本文根据平时绘图经验总结了常用绘图函数,可以直接使用,非常方便impo ...
- python教程怎么抓起数据_介绍python 数据抓取三种方法
三种数据抓取的方法正则表达式(re库) BeautifulSoup(bs4) lxml *利用之前构建的下载网页函数,获取目标网页的html,我们以https://guojiadiqu.bmcx.co ...
- python 软件开发 哔哩哔哩_介绍Python爬取哔哩哔哩视频
栏目介绍如何爬取视频 相关免费学习推荐: 本篇文章主要给大家讲解下如实使用python 爬取哔哩哔哩中的视频,首先我是一名大数据开发工程师,爬虫只是我的一个业余爱好,喜欢爬虫的小伙伴可以一起交流.好了 ...
- 如何用python爬取视频_介绍Python爬取哔哩哔哩视频
python视频教程栏目介绍如何爬取视频 本篇文章主要给大家讲解下如实使用python 爬取哔哩哔哩中的视频,首先我是一名大数据开发工程师,爬虫只是我的一个业余爱好,喜欢爬虫的小伙伴可以一起交流.好了 ...
- python 描述符有什么用_介绍python描述符的意义
你也许经常会听到「描述符」这个概念,但是由于大多数的程序员很少会使用到他,所以可能你并不太清楚了解它的原理,python视频教程栏目将详细介绍 推荐(免费):python视频教程 但是如果你想自己的事 ...
- 调用python脚本并传递参数json格式_使用 Python 处理 JSON 格式的数据
如果你不希望从头开始创造一种数据格式来存放数据,JSON 是一个很好的选择.如果你对 Python 有所了解,就更加事半功倍了.下面就来介绍一下如何使用 Python 处理 JSON 数据. JSON ...
- python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...
参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...
最新文章
- Live Writer 在oschina上的代码高亮插件推荐
- 【Python爬虫】用CSS 选择器提取网页数据
- 【网站开发必备】——12款响应式 Lightbox(灯箱)效果插件
- PHP内核之旅-3.变量
- topaz remask破解版|topaz remask抠图神器5破解版下载
- Win8.1的IE缓存文件夹哪里去了?细说系统安装分区里那些带箭头的文件夹
- 自己整理的机器学习算法应用指南
- 通信网基础缩略语集合
- 力扣练习——23 救生艇
- tensorflow 学习笔记使用CNN做英文文本分类任务
- windows 任务相关 删除任务
- vim 写文档 (自身功能tags, txt2tags生成网页pdf等)
- GridView合并表头单元格
- 微信小程序 用户中心界面(一)
- bzoj3585 mex
- Python中copy()和deepcopy()的区别
- Linux输入法平台
- 爱网外链网盘源码V5.0 全新支持图片检测
- 一个人赶着鸭子去每个村庄卖,每经过一个 村子卖去所赶鸭子的一半又一只。 这样他经过了 七个村子后还剩 两只鸭子,问问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?(递归实现)
- xp wifi android,《解决没无线路由照样WIFI,笔记本xp系统建立wifi使手机上网 - 游戏 - MIUI官方论坛 - 发烧友必刷的Android ROM》.doc...
热门文章
- Oracle实现数据不存在则插入,数据存在则更新(insert or update)
- sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?
- form的get与post方式的区别(转)
- iOS 状态栏 修改为白色字体的步骤
- )类 新建javafx程序时_CML Copley提供的运动控制程序开发类库
- C++ make_shared() shared_ptr()用法
- [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录
- Android解包命令:unpackbootimg与打包命令:mkbootimg使用
- Android 中 C++ Thread线程用法
- undefined reference问题总结