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

苏见山
苏见山
发布时间:2026-10-15| 6人浏览过
原创

本文介绍如何在 Python3 中通过自定义类实现左闭右闭的切片访问。默认情况下 Python 切片为左闭右开,通过重写 __getitem__ 等魔法方法并遵循序列协议,可定制切片行为。示例展示了如何创建 SequenceNew 类,使其支持类似内置序列的操作,并返回指定范围内的元素。

一、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 自定义切片相关内容,请搜索本站以往文章或继续浏览后续文章。感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。