python3 實現(xiàn)自定義切片類為左閉右閉詳情
一、Python 切片的一些用法
alist = [3,4,5,6,7,9,11,13,15,17] print(alist[::]) # 返回包含原列表中所有元素的新列表 print(alist[::-1]) # 返回原列表的逆序排列 print(alist[::2]) # 返回原列表的偶數(shù)位數(shù)據(jù) print(alist[1::2]) # 獲取奇數(shù)位置的數(shù)據(jù) print(alist[3:6]) # 指定切片的開始和結(jié)束位置 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] # 替換元素,結(jié)果按照兩邊的最短元素來決定. print(alist) alist[:3] = [] ?# 刪除列表中前三個元素 del alist[:3] # 切片元素連續(xù) del alist[::2] # 隔一個刪除一個,切片元素不連續(xù)
二、自定義實現(xiàn)一個可切片的序列類
Python 中對序列的切片訪問默認為左閉右開,現(xiàn)自定義實現(xiàn)為左閉右閉。
自定義序列的相關(guān)魔法方法允許我們自己創(chuàng)建的類擁有序列的特性,讓其使用起來就像 Python 的內(nèi)置序列(dict,tuple,list,string 等)。
如果要實現(xiàn)這個功能,就要遵循 python 的相關(guān)的協(xié)議。所謂的協(xié)議就是一些約定內(nèi)容。例如,如果要將一個類要實現(xiàn)迭代,可以實現(xiàn) __iter__() 或者 __getitem__() 其中一個方法。
例子:自定義一個可以被切片的 SequenceNew 類:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numbers ? """ 舉個例子:新建類并修改其實例的切片訪問 ? ? Python 中對序列的切片訪問,是左閉右開。 ? ? 現(xiàn)需要: ? ? ? ? 創(chuàng)建一個可被迭代的類(如果要實現(xiàn)這個功能,就要遵循 python 的相關(guān)的協(xié)議。所謂的協(xié)議就是一些約定內(nèi)容。例如,如果要將一個類要實現(xiàn)迭代,可以實現(xiàn)__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 ? ? ? # 實現(xiàn)了這個魔法函數(shù),就可以是獲取類中某個可迭代元素的下標的元素,也可以使其成為一個可迭代對象 ? ? def __getitem__(self, item): ? ? ? ? # 使用相對編碼,進行類型獲取 ? ? ? ? cls = type(self) ? ? ? ? # 判斷傳遞進來的是slice類型還是int類型,返回不同的類型和操作 ? ? ? ? if isinstance(item, slice): ? ? ? ? ? ? # 左閉右閉的關(guān)鍵實現(xiàn):[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]]) ? ? ? # 返回容器的長度。可變和不可變?nèi)萜鞫家獙崿F(xiàn)它,這是協(xié)議的一部分 ? ? def __len__(self): ? ? ? ? return len(self.__sequence_list) ? ? ? # 實現(xiàn)該魔法函數(shù),可以使這個類成為一個可迭代的對象:對象實現(xiàn)了一個__iter__方法,這個方法負責(zé)返回一個迭代器 ? ? def __iter__(self): ? ? ? ? return iter(self.__sequence_list) ? ? # 迭代器:內(nèi)部實現(xiàn)了next(python3.x為__next__)方法,真正負責(zé)迭代的實現(xiàn)。當?shù)鲀?nèi)的元素用盡之后,任何的進一步調(diào)用都之后觸發(fā) 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]])
以下是輸出結(jié)果:
[2, 3, 4, 5, 6, 7]
到此這篇關(guān)于python3 實現(xiàn)自定義切片類為左閉右閉詳情的文章就介紹到這了,更多相關(guān)Python自定義切片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu16.04/樹莓派Python3+opencv配置教程(分享)
下面小編就為大家分享一篇Ubuntu16.04/樹莓派Python3+opencv配置教程。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù)的實現(xiàn)代碼
這篇文章主要介紹了Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12用Python監(jiān)控NASA TV直播畫面的實現(xiàn)步驟
本文分享一個名為"Spacestills"的開源程序,它可以用于查看 NASA TV 的直播畫面(靜止幀)2021-05-05Python+threading模塊對單個接口進行并發(fā)測試
這篇文章主要為大家詳細介紹了Python+threading模塊對單個接口進行并發(fā)測試,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06