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自定义切片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Python if-elif-else知识点

    详解Python if-elif-else知识点

    本篇文章给大家总结了Python中if-elif-else的相关知识点以及语法相关内容,有兴趣的朋友参考学习下。
    2018-06-06
  • pyCharm 设置调试输出窗口中文显示方式(字符码转换)

    pyCharm 设置调试输出窗口中文显示方式(字符码转换)

    这篇文章主要介绍了pyCharm 设置调试输出窗口中文显示方式(字符码转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python numpy.add函数的具体使用

    Python numpy.add函数的具体使用

    本文主要介绍了Python numpy.add函数的具体使用,numpy.add函数不仅仅是一个简单的加法操作,更是一个功能强大且高度优化的工具,可适用于各种复杂的数值计算和数据处理任务,感兴趣的可以了解一下
    2023-12-12
  • python中实现根据坐标点位置求方位角

    python中实现根据坐标点位置求方位角

    这篇文章主要介绍了python中实现根据坐标点位置求方位角方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Tensorflow 同时载入多个模型的实例讲解

    Tensorflow 同时载入多个模型的实例讲解

    今天小编就为大家分享一篇Tensorflow 同时载入多个模型的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python产生模拟数据faker库的使用详解

    python产生模拟数据faker库的使用详解

    这篇文章主要介绍了python产生模拟数据faker库的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python使用pyforms实现轻松构建GUI

    Python使用pyforms实现轻松构建GUI

    pyforms是一个基于Python的GUI框架,它提供了一种简单而强大的方式来构建图形用户界面,本文将介绍pyforms的使用场景、优势以及常用的Python代码案例,需要的小伙伴可以了解下
    2024-01-01
  • TensorFlow实现模型评估

    TensorFlow实现模型评估

    这篇文章主要为大家详细介绍了TensorFlow实现模型评估,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • python多线程对多核cpu的利用解析

    python多线程对多核cpu的利用解析

    这篇文章主要为大家介绍了python多线程对多核cpu的利用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Django的URLconf中使用缺省视图参数的方法

    Django的URLconf中使用缺省视图参数的方法

    这篇文章主要介绍了Django的URLconf中使用缺省视图参数的方法,Django是最著名的Python的web开发框架,需要的朋友可以参考下
    2015-07-07

最新评论