這篇文章主要介紹Python中序列的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)林甸免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。序列(類似集合,列表,字符串),映射(類似字典)基本上是元素的集合,要實現(xiàn)他們的基本行為(協(xié)議),不可變對象需要兩個協(xié)議,可變對象需要4個協(xié)議。
__len__(self):返回元素的數(shù)量,(為不可變對象需要的協(xié)議之一)=====> len
__iter__返回一個迭代器,具有了__next__方法后,給for使用。
__contains__ 代表 in的意思 xx.__contains__ (22) ==>22 in xx一個效果
__getitem__(self, key)或者__getitem__(self, index), 返回執(zhí)行輸入所關(guān)聯(lián)的值(為不可變對象需要的協(xié)議之一)
__setitem__(self, key, values) 或者 __setitem__(self, index, values) , 設(shè)置指定輸入的值對應(yīng)的values
__delitem__ (self, key) 刪除指定key的值
__missing__這個有意思,跟__getattr__有的一比,是找不到這個key,觸發(fā)條件。前面用列表測試了,暈死了(只對字典有效。)
__del__, 析構(gòu)函數(shù)當(dāng)這個類不存在實例對象時執(zhí)行。
下面我編寫一個自定義類似列表的類,實例后該類默認前面有10個None參數(shù),且不能刪除前面5個空None。(隨口說的,開始寫了)
def check_index(index): if index < 5: raise IndexError('index must greater than 10') class S_List: def __init__(self): self.ll = [None] * 10 def __len__(self): # 提取參數(shù)長度 return len(self.ll) def __getitem__(self, index): # 取出參數(shù) return self.ll[index] def __setitem__(self, index, value): # 設(shè)置參數(shù) check_index(index) self.ll[index] = value def __delitem__(self, index): check_index(index) self.ll.pop(index) def __str__(self): # 打印對象時,輸出列表本身 return str(self.ll) def __del__(self): # 沒有手工刪除在程序結(jié)束時釋放 print('我被釋放了!') sl = S_List() del sl[3] print(isinstance(sl, S_List)) print(f'輸出原始數(shù)據(jù):{sl}') sl[6] = 'six' print(f'修改后原始數(shù)據(jù):{sl}') print(f'隨便取一個值:{sl[1]}') del sl[6] print(f'第二次修改后原始數(shù)據(jù):{sl}') del sl[3] # sl[4] = 'oh' print(sl)
正常輸出:
True 輸出原始數(shù)據(jù):[None, None, None, None, None, None, None, None, None, None] 修改后原始數(shù)據(jù):[None, None, None, None, None, None, 'six', None, None, None] 隨便取一個值:None 第二次修改后原始數(shù)據(jù):[None, None, None, None, None, None, None, None, None] [None, None, None, None, None, None, None, None, None] 我被釋放了!
報錯提示:
Traceback (most recent call last): File "/Users/shijianzhong/Desktop/yunzuan_buy/study_base.py", line 81, in <module> del sl[3] File "/Users/shijianzhong/Desktop/yunzuan_buy/study_base.py", line 73, in __delitem__ check_index(index) File "/Users/shijianzhong/Desktop/yunzuan_buy/study_base.py", line 53, in check_index raise IndexError('index must greater than 10') IndexError: index must greater than 10 我被釋放了!
這個是自定義的一個基本沒有什么方法的偽字典,不能增加元素,而且index,count等方法由于沒有寫入都無法使用。
好的方式是可以繼承l(wèi)ist或者dict的類,在里面對需要的條件進行修改限制,這樣的話,實例出來的對象可以繼承原來的全部方法。
插入一個直接不用初始化自定義變量,直接借用__dict__來實現(xiàn)偽字典型的取值復(fù)制。
class Ii: def __getitem__(self, item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key] = value li = Ii() li[3] = 5 print(li[3]) # 5
這次我可以正真的定義個超級列表,根據(jù)我的需要。現(xiàn)在要求這個列表初始化有5個None元素,前面5個元素不能修改,后面添加的元素必須為str
def check_str(params): if not isinstance(params, str): raise ValueError('parameters must is string') def check_index(index): if index < 5: raise IndexError('index must greater than 10') class Super_List(list): def __init__(self): super(Super_List, self).__init__() # 調(diào)用父類初始化 self += [None] * 5 # 對初始化的參數(shù)進行修改 def append(self, *args): # 對append進行參數(shù)限制 for i in args: check_str(i) return super(Super_List, self).append(*args) def insert(self, index, *args): # 對insert的參數(shù)(索引及插入元素)進行限制 check_index(index) # 判斷插入位置 for i in args: check_str(i) return super(Super_List, self).insert(index, *args) def extend(self, *args): # 對擴張的列表元素進行判斷 temp = args[0] for i in temp: check_str(i) super(Super_List, self).extend(*args) def __delitem__(self, index): # 對del命令的索引進行判斷 check_index(index) super(Super_List, self).__delitem__(index) def clear(self): # 禁止使用clear命令 raise TypeError('No permission') ss_l = Super_List() print(ss_l) ss_l.append('1') ss_l.insert(5, 'a') ss_l.extend(['a', 'b', 'c']) ss_l.clear() print(ss_l)
寫了快半個小時,感覺列表的增加與刪除命令很多,所有有一些命令沒有重寫,但邏輯還是一樣的。
如果向在有人訪問參數(shù)的時候,自動執(zhí)行某些命令,可以寫在__getitem__下面。
跟新后,添加一個__missing__感覺還是非常有意思的。
class Dict(dict): def __init__(self, *args, **kwargs): # self.x = 12 super(Dict, self).__init__(*args, **kwargs) def __missing__(self, key): self[key] = None return self[key] l = Dict(((1,2),(2,3))) print(l) print(l[8]) print(l)
{1: 2, 2: 3} None {1: 2, 2: 3, 8: None}
有點像字典的內(nèi)置方式setdefault,我看能不能改成一樣的。
已經(jīng)寫完了,通過[]取值。
# -*- coding: utf-8 -*- class Dict(dict): def __init__(self, *args, **kwargs): super(Dict, self).__init__(*args, **kwargs) def __missing__(self, item): # 判斷進來的參數(shù)是不是字符串,如果是字符串說明就是對象主動調(diào)用__missing__進來的 # 非__getitem__導(dǎo)入的 if isinstance(item, str): self[item] = 'Default Empty' return self[item] # 如果對象非字符串,明顯說明是__getitem__導(dǎo)入的,判斷長度就可以 else: key, value = item self[key] = value # 自身進行賦值 return self[key] # 返回value def __getitem__(self, item): if not isinstance(item, tuple): # 傳進來的item進行判斷,如果非元祖,直接調(diào)用父類綁定self方法返回 return super(Dict, self).__getitem__(item) elif len(item) == 2 and isinstance(item, tuple): # 如果是元祖,又是2位長度的,進行賦值。其實感覺元祖判斷沒有好像也沒關(guān)系 k, _ = item if k in self: return super(Dict, self).__getitem__(k) # 如果k在self里面繼續(xù)調(diào)用父類綁定self方法返回 else: res = self.__missing__(item) # 否則調(diào)用自身的__missing return res else: raise TypeError('input pattern error') # 元素數(shù)量超過2個,直接報錯 l = Dict((('name','sidian'),('age',99))) print(l) print(l['name','wudian']) print(l['addr','杭州']) print(l['hobby']) print(l)
{'name': 'sidian', 'age': 99} sidian 杭州 Default Empty {'name': 'sidian', 'age': 99, 'addr': '杭州', 'hobby': 'Default Empty'}
以上是“Python中序列的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享文章:Python中序列的示例分析-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://aaarwkj.com/article24/dihije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、微信小程序、服務(wù)器托管、域名注冊、網(wǎng)站改版、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容