自定模块
- Thinkbayes.py
为函数和类的混合结构
- 公共函数
最开始可以定义函数,作为后面类使用的公共函数
- 父类
定义一个class作为父类
def __init__(self, values=None, name=''): self.name = name self.d = {} self.log = False if values is None: return init_methods = [ self.InitPmf, self.InitMapping, self.InitSequence, self.InitFailure, ] for method in init_methods: try: method(values) break except AttributeError: continue if len(self) > 0: self.Normalize()
class传入了参数为object
注意其中name的定义,首先使用关键字参数,然后使用name属性进行绑定
定义一个初始字典,用于放置概率值
属性log为一个标记,其初始化为False
使用values进行辨识,如果参数为none,即进行return,不执行后面的操作(使用不带返回值的return可以提前结束定义的函数)
如果参数不为空,则会进行下一步操作
在循环内添加try-except进行异常处理,在except后添加continue,可以在发生错误的时候继续这个循环(跳过当前出错的循环位置)
def InitFailure(self, values): raise ValueError('None of the initialization methods worked.')
初始化是必须的一步,此处的初始化需要外部输入,如果没有外部输入,则raise一个错误
def __len__(self): return len(self.d)
此处使用的特殊类,在return时使用了内建函数
使用了__len__就可以在外部使用len(实例名)来获得实例的长度(此处就指定了实例的长度就是属性d的长度)
相当于使用__函数名__方法,来实现了一个属性函数,而不是使用方法来获得返回值
def __iter__(self): return iter(self.d)
使用内建的iter生成一个迭代器对象
即iter(实例名)就相当于对字典生成一个迭代器
def Copy(self, name=None): new = copy.copy(self) new.d = copy.copy(self.d) new.name = name if name is not None else self.name return new def Scale(self, factor): new = self.Copy() new.d.clear() for val, prob in self.Items(): new.Set(val * factor, prob) return new
如果需要对实例中的属性进行更改,最后先浅复制一个实例,再对其操作之后返回这个实例
def Log(self, m=None): if self.log: raise ValueError("Pmf/Hist already under a log transform") self.log = True if m is None: m = self.MaxLike() for x, p in self.d.items(): if p: self.Set(x, math.log(p / m)) else: self.Remove(x)
定义方法时,如果想要定义该方法的使用条件,可以在该方法的入口去判定标识符(标识符来自属性)
完成该方法后就更新标识符,其在属性上也会显示出来,表示该实例进行该操作
- 子类
class Pmf(_DictWrapper): def Prob(self, x, default=0): return self.d.get(x, default) def Probs(self, xs): return [self.Prob(x) for x in xs]
此处继承了_DictWrapper这个类,进而可以使用之前定义的属性和方法
当然也可以重写方法
另外,对于轻量级的遍历,最好使用列表推导式,直接返回列表
total = self.Total() if total == 0.0: raise ValueError('total probability is zero.') logging.warning('Normalize: total probability is zero.') return total
logging模块用于记录日志,warning是其中一个级别
logging.warning()会在控制台输出,其也可以记录到日志文件

浙公网安备 33010602011771号