Python-序列切片原理和切片协议-[start:end:step] __getitem__

切片原理图(顾头不顾尾的正则原理)

  

  # [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__协议就可切片,如果想在切片上再切片则需要返回一个对象,通过重新构建对象

猜你喜欢

转载自www.cnblogs.com/2bjiujiu/p/9141825.html