當前位置:
首頁 >
gj5 自定义序列类
發布時間:2024/9/3
31
豆豆
生活随笔
收集整理的這篇文章主要介紹了
gj5 自定义序列类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
5.1 序列類型的分類
容器序列
? list、tuple、deque
扁平序列[同一種數據類型]
? str、bytes、bytearray、array.array
可變序列
? list, deque,bytearray、array
不可變
? str、tuple、bytes
5.2 序列的abc繼承關系
from collections import abc5.3 序列的+、+=和extend的區別
a = [1,2] c = a + [3,4] # c = a + (3,4) #拋異常,+ 號兩邊必須為相同的類型 print(c)#就地加 a += (3,4) #可以為任意序列類型# __iadd__ 實現 print(a)a.extend(range(3)) a.append((1,2)) print(a)--- [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4, 0, 1, 2, (1, 2)]5.4 實現可切片的對象?
# 模式[start:end:step] """其中,第一個數字start表示切片開始位置,默認為0;第二個數字end表示切片截止(但不包含)位置(默認為列表長度);第三個數字step表示切片的步長(默認為1)。當start為0時可以省略,當end為列表長度時可以省略,當step為1時可以省略,并且省略步長時可以同時省略最后一個冒號。另外,當step為負整數時,表示反向切片,這時start應該比end的值要大才行。 """ 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]) # 指定切片的開始和結束位置 aList[0:100] # 切片結束位置大于列表長度時,從列表尾部截斷 aList[100:] # 切片開始位置大于列表長度時,返回空列表aList[len(aList):] = [9] # 在列表尾部增加元素 aList[:0] = [1, 2] # 在列表頭部插入元素 aList[3:3] = [4] # 在列表中間位置插入元素 aList[:3] = [1, 2] # 替換列表元素,等號兩邊的列表長度相等 aList[3:] = [4, 5, 6] # 等號兩邊的列表長度也可以不相等 aList[::2] = [0] * 3 # 隔一個修改一個 print(aList) aList[::2] = ['a', 'b', 'c'] # 隔一個修改一個 aList[::2] = [1, 2] # 左側切片不連續,等號兩邊列表長度必須相等 aList[:3] = [] # 刪除列表中前3個元素del aList[:3] # 切片元素連續 del aList[::2] # 切片元素不連續,隔一個刪一個手動實現序列類型
import numbersclass Group:# 支持切片操作def __init__(self, group_name, company_name, staffs):self.group_name = group_nameself.company_name = company_nameself.staffs = staffsdef __reversed__(self):self.staffs.reverse()def __getitem__(self, item): # 實現切片的關鍵cls = type(self)if isinstance(item, slice): # 傳進來的是切片操作return cls(group_name=self.group_name, company_name=self.company_name, staffs=self.staffs[item])elif isinstance(item, numbers.Integral):return cls(group_name=self.group_name, company_name=self.company_name, staffs=[self.staffs[item]])def __len__(self):return len(self.staffs)def __iter__(self):return iter(self.staffs)def __contains__(self, item):if item in self.staffs: # if xx in 會調用該魔法函數return Trueelse:return Falsestaffs = ["lewen1", "imooc", "lewen2", "lewen3"] group = Group(company_name="imooc", group_name="user", staffs=staffs) reversed(group) for user in group:print(user) --- lewen3lewen2
imooc
lewen1
5.5 bisect管理可排序序列
import bisect from collections import deque#用來處理已排序的序列,用來維持已排序的序列, 升序 #二分查找 # inter_list = [] inter_list = deque() bisect.insort(inter_list, 3) bisect.insort(inter_list, 2) bisect.insort(inter_list, 5) bisect.insort(inter_list, 1) bisect.insort(inter_list, 6) print(inter_list) --- deque([1, 2, 3, 5, 6])print(bisect.bisect_left(inter_list, 7)) # 插入的數據在列表中的位置 print(bisect.bisect_right(inter_list, 7)) --- 5 55.6 什么時候我們不該用列表
追求更高效的時候,可以使用其他的序列類型
# array, deque # 數組 [連續的內存空間]import array# array和list的一個重要區別, array只能存放指定的數據類型 my_array = array.array("i") my_array.append(1) my_array.append("abc")--- TypeError: an integer is required (got type str)5.7 列表推導式、生成器表達式、字典推導式
# 列表生成式 # 提取出1-20 之間的奇數 ? odd_list = [i for i in range(21) if i %2 ==1 ] print(odd_list) [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] def hand_item(item):return item*item odd_list = [hand_item(i) for i in range(21) if i%2==1] ? print(odd_list) [1, 9, 25, 49, 81, 121, 169, 225, 289, 361] # 生成器表達式 odd_gen = (i for i in range(21) if i %2 ==1) print(odd_gen) ? ? # for item in odd_gen: # print(item)odd_list = list(odd_gen) print(type(odd_list)) <generator object <genexpr> at 0x000001DF69EAC7C8> <class 'list'> ? # 字典推導式 my_dict = {"lewen":22,"city":"cq","code":408200} reversed_dict = {value:key for key,value in my_dict.items()} print(reversed_dict) {22: 'lewen', 'cq': 'city', 408200: 'code'} ? # 集合推導式my_set = {key for key ,value in my_dict.items()} # my_set = set(my_dict.keys()) # 取巧的方法 print(type(my_set)) print(my_set)<class 'set'> {'city', 'code', 'lewen'} ?總結
以上是生活随笔為你收集整理的gj5 自定义序列类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gj4 深入类和对象
- 下一篇: gj7 对象引用、可变性和垃圾回收