Python中序列的示例分析-創(chuàng)新互聯

這篇文章主要介紹Python中序列的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

專注于為中小企業(yè)提供成都網站設計、成都網站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)林甸免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯網行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現規(guī)模擴充和轉變。

序列(類似集合,列表,字符串),映射(類似字典)基本上是元素的集合,要實現他們的基本行為(協議),不可變對象需要兩個協議,可變對象需要4個協議。

  • __len__(self):返回元素的數量,(為不可變對象需要的協議之一)=====> len

  • __iter__返回一個迭代器,具有了__next__方法后,給for使用。

  • __contains__ 代表 in的意思 xx.__contains__ (22) ==>22 in xx一個效果

  • __getitem__(self, key)或者__getitem__(self, index), 返回執(zhí)行輸入所關聯的值(為不可變對象需要的協議之一)

  • __setitem__(self, key, values) 或者 __setitem__(self, index, values) , 設置指定輸入的值對應的values

  • __delitem__ (self, key) 刪除指定key的值

  • __missing__這個有意思,跟__getattr__有的一比,是找不到這個key,觸發(fā)條件。前面用列表測試了,暈死了(只對字典有效。)

  • __del__, 析構函數當這個類不存在實例對象時執(zhí)行。

下面我編寫一個自定義類似列表的類,實例后該類默認前面有10個None參數,且不能刪除前面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): # 提取參數長度
    return len(self.ll)
 
  def __getitem__(self, index): # 取出參數
    return self.ll[index]
 
  def __setitem__(self, index, value): # 設置參數
    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): # 沒有手工刪除在程序結束時釋放
    print('我被釋放了!')
 
sl = S_List()
del sl[3]
 
print(isinstance(sl, S_List))
print(f'輸出原始數據:{sl}')
sl[6] = 'six'
print(f'修改后原始數據:{sl}')
print(f'隨便取一個值:{sl[1]}')
del sl[6]
print(f'第二次修改后原始數據:{sl}')
del sl[3]
# sl[4] = 'oh'
print(sl)

正常輸出:

True
輸出原始數據:[None, None, None, None, None, None, None, None, None, None]
修改后原始數據:[None, None, None, None, None, None, 'six', None, None, None]
隨便取一個值:None
第二次修改后原始數據:[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__來實現偽字典型的取值復制。

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

這次我可以正真的定義個超級列表,根據我的需要?,F在要求這個列表初始化有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__()   # 調用父類初始化
    self += [None] * 5           # 對初始化的參數進行修改
 
  def append(self, *args):          # 對append進行參數限制
    for i in args:
      check_str(i)
    return super(Super_List, self).append(*args)
 
  def insert(self, index, *args):       # 對insert的參數(索引及插入元素)進行限制
    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)

寫了快半個小時,感覺列表的增加與刪除命令很多,所有有一些命令沒有重寫,但邏輯還是一樣的。

如果向在有人訪問參數的時候,自動執(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}

有點像字典的內置方式setdefault,我看能不能改成一樣的。

已經寫完了,通過[]取值。

# -*- coding: utf-8 -*-

class Dict(dict):
  def __init__(self, *args, **kwargs):
    super(Dict, self).__init__(*args, **kwargs)

  def __missing__(self, item):
    # 判斷進來的參數是不是字符串,如果是字符串說明就是對象主動調用__missing__進來的
    # 非__getitem__導入的
    if isinstance(item, str):
      self[item] = 'Default Empty'
      return self[item]
    # 如果對象非字符串,明顯說明是__getitem__導入的,判斷長度就可以
    else:
      key, value = item
      self[key] = value   # 自身進行賦值
      return self[key]   # 返回value


  def __getitem__(self, item):
    if not isinstance(item, tuple):  # 傳進來的item進行判斷,如果非元祖,直接調用父類綁定self方法返回
      return super(Dict, self).__getitem__(item)
    elif len(item) == 2 and isinstance(item, tuple):  # 如果是元祖,又是2位長度的,進行賦值。其實感覺元祖判斷沒有好像也沒關系
      k, _ = item
      if k in self:
        return super(Dict, self).__getitem__(k)   # 如果k在self里面繼續(xù)調用父類綁定self方法返回
      else:
        res = self.__missing__(item)       # 否則調用自身的__missing
        return res
    else:
      raise TypeError('input pattern error')     # 元素數量超過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中序列的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯成都網站設計公司行業(yè)資訊頻道!

另外有需要云服務器可以了解下創(chuàng)新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享文章:Python中序列的示例分析-創(chuàng)新互聯
本文網址:http://bm7419.com/article24/dihije.html

成都網站建設公司_創(chuàng)新互聯,為您提供定制開發(fā)、微信小程序、服務器托管、域名注冊、網站改版、網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都網站建設