零基础学Python:自定义序列类的详细教程
生活随笔
收集整理的這篇文章主要介紹了
零基础学Python:自定义序列类的详细教程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.序列類(lèi)型的分類(lèi)
2.序列的+和+=,extend和append的區(qū)別
如果 + 元祖則會(huì)報(bào)錯(cuò), not tuple
c = a + (3,4) #TypeError: can only concatenate list (not "tuple") to list
+ 是新生產(chǎn)一個(gè)list, += 是就地加,不會(huì)新生成list
用+= 則可以是元祖,后面只要是可迭代的就行
其原理是python內(nèi)部抽象基類(lèi)MutableSequence里面有個(gè)魔法函數(shù)__iadd__來(lái)實(shí)現(xiàn)的
可以看到extend和append結(jié)果并不一樣,append是把里面當(dāng)一個(gè)值傳進(jìn)去,extend是迭代的傳進(jìn)去
3.實(shí)現(xiàn)可切片的對(duì)象
(1)切片的用法
#模式[start:end:step] """其中,第一個(gè)數(shù)字start表示切片開(kāi)始位置,默認(rèn)為0;第二個(gè)數(shù)字end表示切片截止(但不包含)位置(默認(rèn)為列表長(zhǎng)度);第三個(gè)數(shù)字step表示切片的步長(zhǎng)(默認(rèn)為1)。當(dāng)start為0時(shí)可以省略,當(dāng)end為列表長(zhǎng)度時(shí)可以省略,當(dāng)step為1時(shí)可以省略,并且省略步長(zhǎng)時(shí)可以同時(shí)省略最后一個(gè)冒號(hào)。另外,當(dāng)step為負(fù)整數(shù)時(shí),表示反向切片,這時(shí)start應(yīng)該比end的值要大才行。 """ aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] #切片返回的是一個(gè)新元素,不會(huì)改變?cè)械膌istprint (aList[::]) # 返回包含原列表中所有元素的新列表 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] print (aList[::-1]) # 返回包含原列表中所有元素的逆序列表 [17, 15, 13, 11, 9, 7, 6, 5, 4, 3] print (aList[::2]) # 隔一個(gè)取一個(gè),獲取偶數(shù)位置的元素 [3, 5, 7, 11, 15] print (aList[1::2]) # 隔一個(gè)取一個(gè),獲取奇數(shù)位置的元素 [4, 6, 9, 13, 17] print (aList[3:6]) # 指定切片的開(kāi)始和結(jié)束位置 [6, 7, 9] print(aList[0:100]) # 切片結(jié)束位置大于列表長(zhǎng)度時(shí),從列表尾部截?cái)? [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] print(aList[100:]) # 切片開(kāi)始位置大于列表長(zhǎng)度時(shí),返回空列表 []# aList[len(aList):] = [9] # 在列表尾部增加元素 # aList[:0] = [1, 2] # 在列表頭部插入元素 # aList[3:3] = [4] # 在列表中間位置插入元素 # aList[:3] = [1, 2] # 替換列表元素,等號(hào)兩邊的列表長(zhǎng)度相等 # aList[3:] = [4, 5, 6] # 等號(hào)兩邊的列表長(zhǎng)度也可以不相等 # aList[::2] = [0] * 3 # 隔一個(gè)修改一個(gè) # print (aList) # aList[::2] = ['a', 'b', 'c'] # 隔一個(gè)修改一個(gè) # aList[::2] = [1,2] # 左側(cè)切片不連續(xù),等號(hào)兩邊列表長(zhǎng)度必須相等 #會(huì)報(bào)錯(cuò) # aList[:3] = [] # 刪除列表中前3個(gè)元素#刪除 # del aList[:3] # 切片元素連續(xù) # del aList[::2] # 切片元素不連續(xù),隔一個(gè)刪一個(gè)(2)實(shí)現(xiàn)對(duì)象支持切片操作
''' 學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' from collections import abc #Sequence協(xié)議import numbers class 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):#當(dāng)前的類(lèi)cls = type(self)#判斷類(lèi)是不是可切片的對(duì)象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:return Trueelse:return Falsestaffs = ["derek1", "derek2", "derek3", "derek4"] group = Group(company_name="alibaba", group_name="user", staffs=staffs)#現(xiàn)在對(duì)象就成可切片的對(duì)象了#__getitem__ for user in group:print(user)#運(yùn)行結(jié)果 # derek1 # derek2 # derek3 # derek4#__contains__ if 'derek1' in group:print('yes')4.列表生成式,字典推導(dǎo)式
# odd_list = [] # for i in range(21): # if i%2 == 1: # odd_list.append(i) # print(odd_list) #[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]#列表生成式 #1.取出1-20之間的基數(shù) 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]#2.取出1-20之間的基數(shù)的平方 def hadle_item(item):return item * itemodd_list = [hadle_item(i) for i in range(21) if i %2 == 1] print(odd_list) #[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]利用字典推導(dǎo)式把字典的key和value做轉(zhuǎn)換:{key:value}變成{value:key}的形式
# 字典推導(dǎo)式的用法 my_dict = {'derek1':11,'derek2':22,'derek3':33} reversed_dict = {value:key for key,value in my_dict.items()} print(reversed_dict) #{11: 'derek1', 22: 'derek2', 33: 'derek3'} 與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的零基础学Python:自定义序列类的详细教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在python函数中参数分类的详细教程
- 下一篇: 零基础学python:魔法函数都有了解吗