python 魔法方法 定製序列 迭代器

2021-10-05 21:07:46 字數 2006 閱讀 4468

容器型別的協議:

如果說你希望定製的容器是不可變的話,你只需要定義__len__()和__getitem__()方法。        :如元組、字串

如果你希望定製的容器是可變的話,除了__len__()和__getitem__()方法,你還需要定義__setitem__()和__delitem__()兩個方法。

容器型別的魔法方法如下:

編寫乙個不可改變的自定義列表,要求記錄列表中每個元素被訪問的次數。

class countlist:

def __init__(self, *args):

self.values = [x for x in args]

self.count = {}.fromkeys(range(len(self.values)), 0)

def __len__(self):

return len(self.values)

def __getitem__(self, key):

self.count[key] += 1

return self.values[key]

注意本例中按下標進行訪問字典

iter():內建函式

__iter__():魔法方法

next()

__next__()

通常迭代器有字典、元組、列表

迭代器的簡單使用:

string='i am a iterable'

it=iter(string)

next(it)

next(it)

沒有元素了,則丟擲乙個stopiteration異常

for語句的工作原理模擬如下:

string='i am a iterable'

it=iter(string)

while true:

try:

each=next(it)

except stopiteration:

break

print(each)

class fibs:

def __init__(self):

self.a = 0

self.b = 1

def __iter__(self):

return self

def __next__(self):

self.a, self.b = self.b, self.a + self.b

return self.a

使用:

fibs=fibs()

for each in fibs:

print(each)

我們會發現這是個四迴圈,明顯沒有出口

可以用判斷each<20條件退出迴圈

也可以在迭代器定義的類中進行修改:

如下:

class fibs:

def __init__(self, n=20):

self.a = 0

self.b = 1

self.n = n

def __iter__(self):

return self

def __next__(self):

self.a, self.b = self.b, self.a + self.b

if self.a > self.n:

raise stopiteration

return self.a

使用:

fibs=fibs(100)

for each in fibs:

print(each)

Python3 魔法方法 定製序列

分別是 列表 元組 字串 python中的協議更像是一種指南,例如鴨子型別,乙隻鳥像鴨子一樣走,像鴨子一樣叫,像鴨子一樣遊然後這只鳥就可以叫做鴨子 如果希望定製的容器是不可變的,那麼只需要定義 len 和 getitem 方法 如果希望定製的容器是可變的,那麼還需要定義 setitem 和 deli...

魔法方法 定製序列(有關Protocol協議)

讀書筆記 重打 class countlist list def init self,args super.init args self count for i in args def len self return len self.count def getitem self,key self....

第047講 魔法方法 定製序列

常言道 無規矩不成方圓 講的是萬事萬物的發展都要在一定的規則下去執行,只有遵循一定的協議去做,事情才能夠按照正確的道路去發展。我們今天要談的是 定製容器,想要成功的實現容器的定製,我們要先談一談協議,那麼什麼是協議呢?協議 protlcols 與其他程式語言中的介面很相似,它規定你在哪些地方必須定義...