|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
小牛有话说:
各位鱼油,大家好。我是小牛,时光荏苒,岁月如梭,一晃半年过去了,小牛希望能在新的一年里把前面挖的坑给填起来,也衷心地希望各位鱼油能在阅读帖子过程中有所收获。。。。。。
本期主要内容导读:
这一期我们归纳一下鱼神第四十七讲“魔法方法:定制容器”。这一期里面鱼神首先讲解了容器的概念,并引入了协议来说明如何定制容器,并通过讲解定义一个不可变的列表并记录列表中被访问元素的次数的例子来说明如何定制容器。下面,我们将对上述内容进行详细展开
1.相关知识点复习
列表推导式见第十二讲课后作业,列表推导式也叫列表解析,灵感取自于函数式编程语言Haskell,用以动态创建列表。使用形式为为[有关A的表达式,for A in B]。这里面第一个为A的一个表达式,A是一个自变量,B一般是一个序列类型, 举例说明:
>>> list2 = [x**2 for x in range(4)] #这里面x为自变量,range(4)为一个序列类型
>>> list2
[0, 1, 4, 9]
fromkeys()是字典内置函数,详见第二十六讲:字典,当索引不好用时。使用形式为fromkeys(iterable, value=None, /),用以为每个key赋值同一个value并返回这个新字典,举例说明:
>>> dict.fromkeys(range(3),0)
{0: 0, 1: 0, 2: 0}
收集参数,详见第十八讲内容:函数,灵活即强大。当函数参数数量不固定时,定义形参变量时在其前面加上一个*,表示该参数为一个数组,所有实参参数都将作为该元组的一个元素传递过来。
>>> def func1(*t):
print(t)
print(type(t))
>>> func1(3,4,"xi")
(3, 4, 'xi')
<class 'tuple'>
>>> func1(1,2)
(1, 2)
<class 'tuple'>
2. 容器类型相关魔法方法
__len__(self) ,当执行len(self)时被触发,返回一个容器类型的个数;__getitem__(self,key),当执行self[key]时被触发,__setitem__(self,key,value)当执行self[key]=value时被触发;__delitem__(self,key)当执行del self[key]时被触发。
3. 定义一个不可变的列表并记录列表中被访问元素的次数,列表不可变则只需使用__len__(self)和__getitem__(self,key)两个魔法方法即可,但首先需要定义构造函数来初始化自定义列表,详细程序如下:
- class Mycountlist:
- def __init__(self,*args):
- self.countlist1 = [x for x in args]
- self.countdict1 = dict.fromkeys(range(len(self.countlist1)),0)
- def __getitem__(self,key):
- self.countdict1[key]+=1
- return self.countlist1[key]
- def __len__(self):
- return len(self.countlist1)
复制代码
>>> list1 = Mycountlist(1,3,5)
>>> list1[2]
5
>>> len(list1)
3
>>> list1.countdict1
{0: 0, 1: 0, 2: 1}
|
评分
-
查看全部评分
|