当前位置:主页 > 聚焦 >

介绍python中slice参数过长的处理方法及实例

时间:2020-12-19 04:38:59

  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参数过长的处理方法及实例的文章就介绍到这了.

热点推荐
1 比特币ETF总净流入达1447万美元

消息,4月24日比特币ETF总净流入为1447万美元。其中,黑石的IBIT净流入2290万美元,摩根士丹利...

2 鲸鱼0x2d2d过去7小时再购入200枚ETH,持有

鲸鱼地址0x2d2d在过去7小时内再次花费200枚ETH购买了17.2亿枚$ASTEROID。目前该地址持有8.38亿枚$...

3 Balancer黑客将14300枚ETH换成419.3枚BTC,价值

Balancer黑客从昨天开始通过Thorchain将14,300枚ETH换成419.3枚BTC,按当前价格计算约合3251万美元。目...

4 波兰加密交易所ZondaCrypto濒临破产,99%比

加密交易所ZondaCrypto的首席执行官Przemysław Kral已前往以色列,因其拥有以色列国籍,可能难以...

5 量子计算机在比特币相关测试中破解ECC密

消息,研究人员使用公共量子硬件成功破解了一个15位的椭圆曲线密钥,赢得了项目Eleven的1 ...

6 Bitget将于4月30日下架22个现货交易对

消息,Bitget宣布将于2026年4月30日上午10:00下架22个现货交易对,此举是基于定期审查的结果。用...

7 Bridgetower采用Chainlink基础设施,完成110亿

Bridgetower Capital已正式采用Chainlink的完整基础设施栈,将110亿美元的证券代币化,涉及Dom X亚利...

8 Polymarket:Kevin Warsh被确认为美联储主席概

消息,预测市场显示,当前关于美联储主席确认的热门事件中,Kevin Warsh的确认概率为98.7%。截...

9 USDC发行2.5亿枚,价值约2.5亿美元

消息,据Whale Alert数据,USDC财库刚刚铸造了2.5亿枚USDC,按实时价格计算约合2.4992亿美元。...

10 以色列总理内塔尼亚胡:启动与黎巴嫩和

消息,以色列总理内塔尼亚胡近期连续发表以下观点:一、以色列已启动一项进程,旨在实现...

成都来彰科技 蜀ICP备2025134723号-1

资讯来源互联网,如有版权问题请联系管理员删除。