程序中的切片,使用原始的索引访问时,如果数量过多,时间久了,就会导致难以阅读和维护。但使用slice()函数,创建【命名切片】后,赋予了切片与现实相近的名称,让程序更容易理解。
同时,slice类中的indices方法,返回start,stop,step,3个值组成的元组。
并且indices()对3个值进行自动调整,确保其在规定的序列长度以内。
因此,使用它们,对序列进行检索时,可以避免出现IndexError异常。
一、slice()的定义和命名切片
1、slice()定义
class slice(stop)
class slice(start, stop, step=None)
start:起始值,可省略。省略时,从头开始
stop:结束值,必须有
step:步长,不可为0,可不写
返回一个slice对象,可以用在任意代表切片的地方
示例:
lst = [0, 1, 2, 3, 4]
s = slice(1, 4)
lst[s] # [1, 2, 3]
lst[1:4] # [1, 2, 3]
2、命名切片(重要!!!)
刚刚的s可以用在任意需要使用切片的地方,s就是一个命名切片。
具体示例(列表中名字后面加了数字,是为更方便阅读):
# 比如:下面有个12名学生的总表,需要对他们进行分组。
# 1、3、5...为第1组,
# 2、4、6...为第2组
# 直接用[0:11:2]或者[1:11:2]
# 写程序,在后期进行维护的时候,
# 就不知道是什么意思
# 用命名切片就行了
stu_all = ['lili0','mike1','john2','steve3','jungle4','tina5','cici6','esless7','alibird8','sky9','tutu10','new11']
group1 = slice(0,12,2)
group2 = slice(1,12,2)
print(stu_all[group1])
print(stu_all[group2])
程序运行后,返回:
['lili0', 'john2', 'jungle4', 'cici6', 'alibird8', 'tutu10']
['mike1', 'steve3', 'tina5', 'esless7', 'sky9', 'new11']
这样在后期维护的过程中,就更容易读懂和维护了。
二、slice对象的indices(length)方法
返回一个包含3个元素的【元组】,分别代表start,stop,step,常见的写法如下:
# 生成slice类:s,
# start,stop,step值是5,12,2
s = slice(5,12,2)
start,stop,step = s.indices(len(ord_lst))
说明 :
1、length是一个整数,一般是一个序列的长度
2、s是一个已经赋值了的切片类
3、如果s中的start,stop,step值在length范围内,则将s的3个值,作为indices()的返回值
4、如果s中的start>length,则start和stop都将赋值为length(也就是切片初始值超出了拟检索序列的范围)
5、如果使用[-5:-1]的形式,反向访问序列,经过indices()后,会返回“从前向后”序列的实际值
三、使用“命名切片”和indices方法检索数据
常见写法如下:
for i in range(*s.indices(len('1234567876876982736'))):
print(s[i])
注意*s.indices(),是对元组(start,stop,step)进行解包,当作range()的参数
这篇文章涉及另外2个扩展知识点:
1、*、**有啥区别,arg/*args/**kwargs呢?
2、python中的序列赋值规则
如果有兴趣,就给我留言吧。哈哈,我也是查了很多资料才搞明白滴