python3 实现自定义切片类为左闭右闭详情
作者:if 发布时间:2022-11-02 11:36:51
标签:Python,自定义,切片
一、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]
来源:https://blog.csdn.net/weixin_42018518/article/details/102671262


猜你喜欢
- 不知各位是否有手写代码的习惯。例如:要在一个单元格插入一段CSS代码,或者一段Javascript代码,怎么做才比较快捷方便呢?虽然Drea
- 概述Web环境我们假设为Apache。在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块。Ap
- 一、开发工具**Python****版本:**3.6.4相关模块:DecryptLogin模块;argparse模块;以及一些Python自
- 在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我们不能做出很令人信服的测试。通过测试
- 前言树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效
- 过年这段时间由于线上数据库经常压力过大导致响应非常缓慢甚至死机,咬咬牙下大决心来解决效率不高的问题!首先是由于公司秉承快速开发原则,频繁上线
- 如下所示:原因1:版本不对,如用环境变量设置的python3.7路径,那么用的就是3.7的pip.exe安装了包。却用的是2.7的pytho
- 看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。其实市面上有一些软件可以代刷流量 比如 流量精
- 废话不多说,大家还是直接看代码吧!import pandas as pdfrom matplotlib import pyplot as p
- 概述 一、 初识setup函数 组件中所用到的:数据、方法等等均要配置在setup中,这也就意味着在Vue2中写的dat
- 使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库。一、Nginx access日志
- 插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。根据这些情况,可以分别进行优化,本节将介绍优化插入记录速度的几种方法。
- 利用python实现防撤回,对方撤回的消息可在自己的微信文件传输助手中查看。如果想变成可执行文件放在电脑中运行,可用pyinstaller将
- 第一种方法:****1.****打开SQL Server,写好登录名和密码点击连接.****2.****打开数据库,右键某一个数据库,选择&
- 引言使用python进行接口测试时常常需要接口用例测试数据、断言接口功能、验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据
- 如下所示:由图中可见,当前使用的是 unittest 测试框架修改方式如下:来源:https://blog.csdn.net/HeatDea
- 本文介绍了使用Python来扫描指定目录下的文件,或者匹配指定后缀和前缀的函数。步骤如下:如果要扫描指定目录下的文件,包括子目录,需要调用s
- 本文使用的是163邮件进行测试。注:163邮箱现在需要使用 客户端授权码 进行测试,不再支持邮箱密码进行测试。 
- 这种组合使得开发Web程序简单、安全、效率高。由于程序是在Linux下运行,虽免去了版权费用,对数据库的管理却少了Windows下的图形界面
- Python编程时,经常需要跳过第一行读取文件内容。简单的做法是为每行设置一个line_num,然后判断line_num是否为1,如果不等于