01-列表操作-使用slice()命名切片,增强程序可读及可维护性,兼使用indices()方法,防止出现序列访问异常

程序中的切片,使用原始的索引访问时,如果数量过多,时间久了,就会导致难以阅读和维护。但使用slice()函数,创建【命名切片】后,赋予了切片与现实相近的名称,让程序更容易理解。

同时,slice类中的indices方法,返回start,stop,step,3个值组成的元组。

并且indices()对3个值进行自动调整,确保其在规定的序列长度以内。

因此,使用它们,对序列进行检索时,可以避免出现IndexError异常。

一、slice()的定义和命名切片 

1、slice()定义

class slice(stop)

class slice(startstopstep=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中的序列赋值规则

如果有兴趣,就给我留言吧。哈哈,我也是查了很多资料才搞明白滴

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值