zoukankan      html  css  js  c++  java
  • 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__协议就可切片,如果想在切片上再切片则需要返回一个对象,通过重新构建对象

  • 相关阅读:
    什么是兼容性测试?请举例说明如何利用兼容性测试列表进行测试。
    如何定位测试用例的作用?
    为什么要在一个团队中开展软件测试工作?
    安装git和小乌龟
    idea配置tomcat
    Maven下载及配置
    JDK(1.6,1.7,1.8,10,11)64位解压版配置使用
    SQL中Case When的用法
    mybatis批量新增和修改删除
    org.apache.ibatis.binding.BindingException表示mapper.xml没找到
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/9141825.html
Copyright © 2011-2022 走看看