python3 实现自定义切片类为左闭右闭详情

 更新时间:2022年06月21日 15:18:25   作者:if 0 = -I can  
这篇文章主要介绍了python3 实现自定义切片类为左闭右闭详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

一、Python 切片的一些用法

alist = [3,4,5,6,7,9,11,13,15,17]
print(alist[::]) # 返回包含原列表中所有元素的新列表
print(alist[::-1]) # 返回原列表的逆序排列
print(alist[::2]) # 返回原列表的偶数位数据
print(alist[1::2]) # 获取奇数位置的数据
print(alist[3:6]) # 指定切片的开始和结束位置
print(alist[0:100]) # 切片位置大于列表长度时,从列表尾部截断
print(alist[100:]) # 切片开始位置大于列表长度时,返回空列表
alist[len(alist):]=[9] # 在列表尾部增加元素
print(alist)
alist[:0] = [1,2] # 前面的0省略了,相当于是alist[0:0] = [1,2]
print(alist)      # 在列表的头部增加元素
alist[3:3] =[4] # 在列表中间插入元素
print(alist)
alist[:3] = [1,2] # 相当于是alist[0:3] = [1,2] 替换列表元素
alist[3:] = [4,5,6] # 替换元素,结果按照两边的最短元素来决定.
print(alist)
alist[:3] = []  # 删除列表中前三个元素
del alist[:3] # 切片元素连续
del alist[::2] # 隔一个删除一个,切片元素不连续

二、自定义实现一个可切片的序列类

 Python 中对序列的切片访问默认为左闭右开,现自定义实现为左闭右闭。

自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 Python 的内置序列(dict,tuple,list,string 等)。
 如果要实现这个功能,就要遵循 python 的相关的协议。所谓的协议就是一些约定内容。例如,如果要将一个类要实现迭代,可以实现 __iter__() 或者 __getitem__() 其中一个方法。
例子:自定义一个可以被切片的 SequenceNew 类:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numbers
 
"""
举个例子:新建类并修改其实例的切片访问
    Python 中对序列的切片访问,是左闭右开。
    现需要:
        创建一个可被迭代的类(如果要实现这个功能,就要遵循 python 的相关的协议。所谓的协议就是一些约定内容。例如,如果要将一个类要实现迭代,可以实现__iter__() 或者 __getitem__()其中一个方法)
        改变默认的切片访问方式为左闭右闭
        举例:c1=youclassname([0,1,2,3,4,5,6,7,8,9])
        c1[2:7] 返回2,3,4,5,6,7
"""
 
class SequenceNew(object):
 
    def __init__(self, sequence_list):
        self.__sequence_list = sequence_list
        self.__list_index = 0
 
    # 实现了这个魔法函数,就可以是获取类中某个可迭代元素的下标的元素,也可以使其成为一个可迭代对象
    def __getitem__(self, item):
        # 使用相对编码,进行类型获取
        cls = type(self)
        # 判断传递进来的是slice类型还是int类型,返回不同的类型和操作
        if isinstance(item, slice):
            # 左闭右闭的关键实现:[item.start : item.stop : item.step] 。即:class slice(start, stop[, step])
            return cls(sequence_list = self.__sequence_list[item.start : item.stop + 1])
        elif isinstance(item, numbers.Integral):
            return cls(sequence_list = [self.__sequence_list[item]])
 
    # 返回容器的长度。可变和不可变容器都要实现它,这是协议的一部分
    def __len__(self):
        return len(self.__sequence_list)
 
    # 实现该魔法函数,可以使这个类成为一个可迭代的对象:对象实现了一个__iter__方法,这个方法负责返回一个迭代器
    def __iter__(self):
        return iter(self.__sequence_list)
    # 迭代器:内部实现了next(python3.x为__next__)方法,真正负责迭代的实现。当迭代器内的元素用尽之后,任何的进一步调用都之后触发 StopIteration 异常,所以迭代器需要一个__iter__方法来返回自身
    def __next__(self):
        try:
            i = self.__sequence_list[self.__list_index]
        except IndexError:
            raise StopIteration
        self.__list_index += 1
        return i
sn = SequenceNew([0,1,2,3,4,5,6,7,8,9])
print([ i for i in sn[2:7]])

以下是输出结果:

[2, 3, 4, 5, 6, 7]

到此这篇关于python3 实现自定义切片类为左闭右闭详情的文章就介绍到这了,更多相关Python自定义切片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3启动web服务引发的一系列问题汇总

    python3启动web服务引发的一系列问题汇总

    由于行内交付的机器已自带python3 ,没有采取自行安装python3,但是运行python脚本时报没有tornado module,遇到这样的问题如何处理呢,下面小编给大家介绍下python3启动web服务引发的一系列问题汇总,感兴趣的朋友一起看看吧
    2023-02-02
  • python中的错误处理

    python中的错误处理

    异常是指程序中的例外,违例情况。异常机制是指程序出现错误后,程序的处理方法。当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理。
    2016-04-04
  • Python中的文件定位方式

    Python中的文件定位方式

    这篇文章主要介绍了Python中的文件定位方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Django Highcharts制作图表

    Django Highcharts制作图表

    Highcharts图表控件是目前使用最为广泛的图表控件 ,是纯JS图表库。这篇文章主要介绍了Django Highcharts制作图表的相关资料,非常的详细,有需要的小伙伴可以来参考下
    2016-08-08
  • 在django中图片上传的格式校验及大小方法

    在django中图片上传的格式校验及大小方法

    今天小编就为大家分享一篇在django中图片上传的格式校验及大小方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python手搓邮件发送客户端

    Python手搓邮件发送客户端

    这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下
    2025-01-01
  • python日志通过不同的等级打印不同的颜色(示例代码)

    python日志通过不同的等级打印不同的颜色(示例代码)

    这篇文章主要介绍了python日志通过不同的等级打印不同的颜色,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • python装饰器练习题及答案

    python装饰器练习题及答案

    这篇文章主要介绍了python装饰器练习题及答案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 简单谈谈Python面向对象的相关知识

    简单谈谈Python面向对象的相关知识

    由于马上就要期末考试了,正在抓紧时间复习 所以这一篇就拖了很久,抱歉啦~ 今天会说说: 属性私有,方法私有,重写,魔术方法,需要的朋友可以参考下
    2021-01-01
  • 基于Python实现m3u8视频下载

    基于Python实现m3u8视频下载

    m3u8 是一种基于文本的媒体播放列表文件格式,通常用于指定流媒体播放器播放在线媒体流,本文将利用Python实现m3u8视频下载器,感兴趣的可以了解一下
    2023-05-05

最新评论