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参数过长的处理方法及实例相关推荐

  1. python的六个类型_介绍Python中6个序列的内置类型

    原标题:介绍Python中6个序列的内置类型 1.Python中6个序列的内置类型分别是什么? Python包含6中内建的序列,即列表.元组.字符串.Unicode字符串.buffer对象和 xran ...

  2. python request对四类参数的处理_如何处理Djang中同一参数具有多个变量的request.GET...

    在Django视图中,您可以访问request.GET['variablename'],因此在您的视图中,您可以执行如下操作:myvar = request.GET['myvar'] 实际的reque ...

  3. python mat函数的作用_介绍python的matplotlib常用绘图函数

    免费学习推荐:python视频教程 matplotlib具有强大的绘图功能,但是语句琐碎,每次使用都需要一句一句书写未免太过麻烦.本文根据平时绘图经验总结了常用绘图函数,可以直接使用,非常方便impo ...

  4. python教程怎么抓起数据_介绍python 数据抓取三种方法

    三种数据抓取的方法正则表达式(re库) BeautifulSoup(bs4) lxml *利用之前构建的下载网页函数,获取目标网页的html,我们以https://guojiadiqu.bmcx.co ...

  5. python 软件开发 哔哩哔哩_介绍Python爬取哔哩哔哩视频

    栏目介绍如何爬取视频 相关免费学习推荐: 本篇文章主要给大家讲解下如实使用python 爬取哔哩哔哩中的视频,首先我是一名大数据开发工程师,爬虫只是我的一个业余爱好,喜欢爬虫的小伙伴可以一起交流.好了 ...

  6. 如何用python爬取视频_介绍Python爬取哔哩哔哩视频

    python视频教程栏目介绍如何爬取视频 本篇文章主要给大家讲解下如实使用python 爬取哔哩哔哩中的视频,首先我是一名大数据开发工程师,爬虫只是我的一个业余爱好,喜欢爬虫的小伙伴可以一起交流.好了 ...

  7. python 描述符有什么用_介绍python描述符的意义

    你也许经常会听到「描述符」这个概念,但是由于大多数的程序员很少会使用到他,所以可能你并不太清楚了解它的原理,python视频教程栏目将详细介绍 推荐(免费):python视频教程 但是如果你想自己的事 ...

  8. 调用python脚本并传递参数json格式_使用 Python 处理 JSON 格式的数据

    如果你不希望从头开始创造一种数据格式来存放数据,JSON 是一个很好的选择.如果你对 Python 有所了解,就更加事半功倍了.下面就来介绍一下如何使用 Python 处理 JSON 数据. JSON ...

  9. python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...

    参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...

最新文章

  1. Live Writer 在oschina上的代码高亮插件推荐
  2. 【Python爬虫】用CSS 选择器提取网页数据
  3. 【网站开发必备】——12款响应式 Lightbox(灯箱)效果插件
  4. PHP内核之旅-3.变量
  5. topaz remask破解版|topaz remask抠图神器5破解版下载
  6. Win8.1的IE缓存文件夹哪里去了?细说系统安装分区里那些带箭头的文件夹
  7. 自己整理的机器学习算法应用指南
  8. 通信网基础缩略语集合
  9. 力扣练习——23 救生艇
  10. tensorflow 学习笔记使用CNN做英文文本分类任务
  11. windows 任务相关 删除任务
  12. vim 写文档 (自身功能tags, txt2tags生成网页pdf等)
  13. GridView合并表头单元格
  14. 微信小程序 用户中心界面(一)
  15. bzoj3585 mex
  16. Python中copy()和deepcopy()的区别
  17. Linux输入法平台
  18. 爱网外链网盘源码V5.0 全新支持图片检测
  19. 一个人赶着鸭子去每个村庄卖,每经过一个 村子卖去所赶鸭子的一半又一只。 这样他经过了 七个村子后还剩 两只鸭子,问问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?(递归实现)
  20. xp wifi android,《解决没无线路由照样WIFI,笔记本xp系统建立wifi使手机上网 - 游戏 - MIUI官方论坛 - 发烧友必刷的Android ROM》.doc...

热门文章

  1. Oracle实现数据不存在则插入,数据存在则更新(insert or update)
  2. sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?
  3. form的get与post方式的区别(转)
  4. iOS 状态栏 修改为白色字体的步骤
  5. )类 新建javafx程序时_CML Copley提供的运动控制程序开发类库
  6. C++ make_shared() shared_ptr()用法
  7. [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录
  8. Android解包命令:unpackbootimg与打包命令:mkbootimg使用
  9. Android 中 C++ Thread线程用法
  10. undefined reference问题总结