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

本文详细介绍了Python中切片的基本原理及应用,包括正则原理、步长使用、切片协议__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__协议就可切片,如果想在切片上再切片则需要返回一个对象,通过重新构建对象

转载于:https://www.cnblogs.com/2bjiujiu/p/9141825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值