Python自制probability库

import random

class Probability:
    '''
    Probability has 4 init syntax:
    1.pro=Probability(kwargs_dict)
    2.pro=Probability(__else__,kwargs_dict)
    3.pro=Probability(**kwargs)
    4.pro=Probability(__else__,**kwargs)
    '''
    def __init__(self, __else__=None,kwargs_dict={},**kwargs):
        if type(__else__)==dict:
            kwargs_dict=__else__
            __else__=None
        if not kwargs_dict and not kwargs:
            raise ValueError('__init__() must take one argument between dict and **kwargs(0 given)')
        if kwargs_dict and kwargs:
            raise ValueError('__init__() takes only one argument between dict and **kwargs(2 given)')
        if kwargs_dict:
            kwargs=kwargs_dict
        total = 0
        for key in kwargs:
            total+=kwargs[key]
        if total>100:
            raise ValueError('The sum of the argment of Probability() must Less than or equal to 100')
        self.pros=kwargs
        self.__else__=__else__
        self.total=total
        self.diary=[]
    def get(self):
        num=random.random()*100
        now=0
        for key in self.pros:
            if now<num<=now+self.pros[key]:
                self.diary.append(key)
                return key
            now+=self.pros[key]
        self.diary.append(self.__else__)
        return self.__else__
    
    def test(self,num=100000):
        d={}
        for _ in range(num):
            key=self.get()
            if key in d:
                d[key]+=1
            else:
                d[key]=0
        return d
    
    def append(self,kwargs_dict={},**kwargs):
        if not kwargs_dict and not kwargs:
            raise ValueError('append() must takes one argument between dict and **kwargs(0 given)')
        if kwargs_dict and kwargs:
            raise ValueError('append() takes only one argument between dict and **kwargs(2 given)')
        if kwargs_dict:
            kwargs=kwargs_dict
        total = self.total
        pros=self.pros

        for key in kwargs:
            total+=kwargs[key]
            pros[key]=kwargs[key]
        if total>100:
            raise ValueError('和不能大于100')
        
        self.pros=pros
        self.total=total

class Average_Probability(Probability):
    '''
    Average_Probability has 2 init syntax:
    1.pro=Probability(args_list)
    2.pro=Probability(*args)
    ( 2.pro=Probability([],*args) )
    '''
    def __init__(self, args_list=[], *args):
        if not args_list and not args:
            raise ValueError('__init__() must takes one argument between list and *args(0 given)')
        if args_list and args and type(args_list)==list:
            raise ValueError('__init__() takes only one argument between list and *args(2 given)')
        if args_list and type(args_list)==list:
            args=args_list
        if type(args_list)!=list:
            args=list(args)
            args.append(args_list)
        pros={}
        for i in args:
            pros[i]=100/len(args)
        self.pros=pros
        self.__else__=None
        self.total=len(args)
        self.diary=[]
    
    def append(self,args_list=[],*args):
        if not args_list and not args:
            raise ValueError('__init__() must takes one argument between list and *args(0 given)')
        if args_list and args and type(args_list)==list:
            raise ValueError('__init__() takes only one argument between list and *args(2 given)')
        if args_list and type(args_list)==list:
            args=args_list
        if type(args_list)!=list:
            args=list(args)
            args.append(args_list)
        args+=list(self.pros.keys())
        args=set(args)
        pros={}
        for i in args:
            if i not in pros:
                pros[i]=100/len(args)
        self.pros=pros
        self.total=len(args)


class randrange(Probability):
    def __init__(self, start, stop=None, step=None):
        self.start=start
        self.stop=stop
        self.step=step
    
    def get(self):
        if self.step:
            return random.randrange(self.start,self.stop,self.step)
        if self.stop:
            return random.randrange(self.start,self.stop)
        return random.randrange(self.start,self.stop,self.step)
    
    def __str__(self):
        return str(self.get())

class Branch(Probability):
    '''
    bra=Branch(10,30,25).get()
    if bra==0:
        pass
    elif bra==1:
        pass
    elif bra==2:
        pass
    else:
        pass
    '''
    def __init__(self,*args):
        super().__init__('else',{i:args[i] for i in range(len(args))})

用法:

from probability import Probability as pro

print(pro('else',a=10,b=20,c=40).get())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值