【Python学习日记】B站小甲鱼:定制容器和迭代器

协议  Python中的协议更像一种指南

如果定制的容器是不变的,只需要定义len()和getitem()方法

如果希望定制的容器是可变的,除了定义len()和getitem()而外,还需要定义setitem()和delitem()方法

len()    返回容器中元素的个数

getitem()  获得容器中指定元素, 类似self()

setitem()  设置容器中指定元素, 类似set(key) = value

delitem()  删除容器中指定元素, 类似del self(key)

 

练习:要求自定义一个不可变的列表,返回其中元素的调用次数

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]


c1 = Countlist(1, 3, 5, 7, 9)
c2 = Countlist(2, 4, 6, 8, 10)
print(c1[1])
print(c2[1])
print(c1[1]+c2[1])
print(c1.count)

输出结果是

3
4
7
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}

 


 

迭代

iter()  生成迭代器

next()  迭代器返回下一个值

比如

it = iter('Hydra')
print(next(it))
while True:
    try:
        each = next(it)
    except StopIteration:
        break
    print(each)

每一次next()就可以输出一个字符从H到a,结束以后再next()就会报错。这里的it相当于是一个迭代器

相当于for语句

string = 'Hydra'
for each in string:
    print(each)

 

posted @ 2020-09-14 21:56  JodyJoy  阅读(110)  评论(0编辑  收藏  举报