在Python中为什么切片要忽略最后一个元素?

在切片和区间操作里不包含区间范围的最后一个元素是Python 的风格,这个习惯符合Python C和其他语言里以0作为起始下标的传统.

当只有最后一个位置信息时,我们也可以快速看出切片和区间里有一个元素:range(3)my_list[:3]都返回3个元素

当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去前一个下标即可

这样做也让我们可以利用任意一个下标来吧序列分割成不重叠的两部分: list[:x] list[x:]

l = [10, 20, 30, 40, 50, 60]
print(l[:2], "---", l[2:])  # 在下标2的地方分割

对对象进行切片

一个众所周知的秘密是,我们可以用s[a:b:c]的形式对s在a和b之间以c为间隔取值.

c的值还可以为负,负值意味着反向取值.

s = "python"
print(s[::2])
print(s[::-1])
print(s[::-2])

a:b:c这种用法只能作为索引或者下标用在[]中来返回一个切片对象.

seq[start:end:step]进行求值的时候,Python会调用seq.__getitem__(slice(start, end, step)).

可以给切片命名,提示代码的可读性

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
students = """
0001    小明  16  99
0002    小红  18  98
0003    小李  17  99
0004    小王  20  100
"""
number = slice(0, 4)
name = slice(8, 10)
age = slice(12, 14)
student_items = students.split("\n")
for item in student_items:
    print(item[number], "---", item[name], "---", item[age]) if item else None

给切片赋值 如果把切片放在赋值语句的左边,或者把它作为del操作的对象,我们就可以对序列进行嫁接,切除或就地修改操作.

l = list(range(10))
print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l[2:5] = [20, 30]
print(l)  # [0, 1, 20, 30, 5, 6, 7, 8, 9]
del l[5:7]
print(l)  # [0, 1, 20, 30, 5, 8, 9]
l[3::2] = [11, 22]
print(l)  # [0, 1, 20, 11, 5, 22, 9]
l[2:5] = [100]  # 如果赋值的对象是一个切片,那么赋值语句的右侧必须是个可迭代对象,即便只有单独的一个值,也要把它转换成可迭代的序列.
print(l)  # [0, 1, 100, 22, 9]
l[2:4] = [11, 22, 33, 44, 66]  # 步长为1时,切片长度和赋值长度可以不等
print(l)
# l[::2] = [1, 2, 3, 4, 5]  # 步长不为1时,切片长度和赋值长度必须相等
# ValueError: attempt to assign sequence of size 6 to extended slice of size 4

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:更多Python视频教程-关注B站:Python学习者
https://www.bilibili.com/video/BV1LL4y1h7ny?share_source=copy_web

Python爬虫案例教程推荐:更多Python视频教程-关注B站:Python学习者
https://www.bilibili.com/video/BV1QZ4y1N7YA?share_source=copy_web

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值