首页 > 编程 > Python > 正文

Python进阶之全面解读高级特性之切片

2020-02-16 01:14:15
字体:
来源:转载
供稿:网友

众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢?

切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象。通常来说,切片的作用就是截取序列对象,然而,对于非序列对象,我们是否有办法做到切片操作呢?在使用切片的过程中,有什么要点值得重视,又有什么底层原理值得关注呢?本文将主要跟大家一起来探讨这些内容,希望我能与你共同学习进步。

1、切片的基础用法

列表是 Python 中极为基础且重要的一种数据结构,也是最能发挥切片的用处的一种数据结构,所以在前两节,我将以列表为例介绍切片的一些常见用法。

首先是切片的书写形式:[i : i+n : m] ;其中,i 是切片的起始索引值,为列表首位时可省略;i+n 是切片的结束位置,为列表末位时可省略;m 可以不提供,默认值是1,不允许为0 ,当m为负数时,列表翻转。注意:这些值都可以大于列表长度,不会报越界。

切片的基本含义是:从序列的第i位索引起,向右取到后n位元素为止,按m间隔过滤 。

li = [1, 4, 5, 6, 7, 9, 11, 14, 16]# 以下写法都可以表示整个列表,其中 X >= len(li)li[0:X] == li[0:] == li[:X] == li[:] == li[::] == li[-X:X] == li[-X:]li[1:5] == [4,5,6,7] # 从1起,取5-1位元素li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2间隔过滤li[-1:] == [16] # 取倒数第一个元素li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素li[:-2] == li[-len(li):-2] == [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素# 步长为负数时,列表先翻转,再截取li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2间隔过滤li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3间隔过滤# 切片的步长不可以为0li[::0] # 报错(ValueError: slice step cannot be zero)

上述的某些例子对于初学者(甚至很多老手)来说,可能还不好理解,但是它们都离不开切片的基本语法,所以为方便起见,我将它们也归入基础用法中。

对于这些样例,我个人总结出两条经验:

(1)牢牢记住公式[i : i+n : m],当出现缺省值时,通过想象把公式补全;

(2)索引为负且步长为正时,按倒数计算索引位置;索引为负且步长为负时,先翻转列表,再按倒数计算索引位置。

2、切片的高级用法

一般而言,切片操作的返回结果是一个新的独立的序列。以列表为例,列表切片后得到的还是一个列表,占用新的内存地址。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表