切片原理图(顾头不顾尾的正则原理)
# [0:1] 其实只取到C, 取e则 [-1:], 如果步长为负数则倒过来取,从第几个往回取
name = "ChuiXue"
print(name[0:1])
print(name[-1:])
print(name[::-1])
对于可变数据类型,则可以通过切片实现数据添加修改, 如添加数据、替换数据、删除元素
number = [1, 2, 3]
# 修改第一个数据, 直接把对象依次传递进去
number[:1] = [5, 6]
print(number)
# 结果是 [5, 6, 2, 3]
# 某个位置插入元素, stat = end, 等价于 +=
number[0:0] = [1.1, 2.4]
print(number)
# 替换切片选中的数据, start != end
number[1:2] = [3.3, 4.4]
print(number)
# 等步长替换
number[::2] = ['北门吹雪', 'beimenchuixue', 'QiNiuYun', "JinRiTouTiao"]
print(number)
# 删除数据
del number[1:2]
print(number)
切片协议 __getitem__
类中实现这个方法,那么这个类实例的对象就可以进行切片操作
from numbers import Integral
class BeiMenChuiXue:
def __init__(self, names):
self.names = names
def __getitem__(self, item):
if isinstance(item, Integral):
return self.names[item]
else:
# 返回对象依旧尅再进行切片
return self.__class__(self.names[item])
if __name__ == '__main__':
names = ["北门吹雪", "QiNiuYun", "JinRiTouTiao", "AliYun", "TengXun"]
bei_men_chui_xue = BeiMenChuiXue(names)
new_names = bei_men_chui_xue[:]
print(new_names[1])
# 再次切片
print(new_names[:3][1])
经验:
1. 切片不仅仅可以获取序列的子序列,还可以进行可变序列的添加、修改、删除等操作
2. 对对象可切片,遵守 __getitem__协议就可切片,如果想在切片上再切片则需要返回一个对象,通过重新构建对象