【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)