在切片和区间操作里不包含区间范围的最后一个元素是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