学数学的好处(记一次概率论的应用)

今天上午,和往常一样开开心心的从别处找一个功能相似的代码。复制粘贴正准备干的时候,忽然感觉这段代码有些诡异,遂细细的看了看,更越觉得不对了。

这段代码大概长这样。

# 这里有两个列表,每个列表有一些元素
s1 = []
s2 = []

# 这里有个函数,做了些什么
def func(a, b):
    if b in s1 and a not in s1:
        return b
    if a in s1:
        return a
    if b in s2 and a not in s2:
        return b
    return a
复制代码

是不是大家也觉得这个代码有问题。

直觉上感觉这里的if可以简化下,但不知道怎么简化。想到最近刚学了点概率论,这里好像可以用一下。

先定义四个事件

A = {a in s1}

B = {b in s1}

C = {第一个return return b}

D = {第二个return return a}

然后,将上面的代码转成数学表达式

b in s1 and a not in s1 => B \cap \overline{A}

a in s1 => A

那么

\begin{eqnarray*} p(C) &=& p( B \cap \overline{A} )\\ &=& p(  \overline{A} \cap B ) \end{eqnarray*}
\begin{eqnarray*} p(D) &=& p(\overline{ C } \cap A )\\ &=& p(\overline{ B \cap \overline{A} } \cap A )\\ &=& p( (\overline{B} \cup A) \cap A )\\ &=& p( \overline{B} A \cup A A )\\ &=& p( \overline{B} A \cup A )\\ &=& p(A) \end{eqnarray*}

这样就很清晰了,当A发生时,返回a;当A不发生且B发生时,返回b。

于是前两个if可以优化为

if a in s1:
    return a
if b in s1:
    return b
复制代码

按照这个方法,可以把代码优化成这样

def func(a, b):
    if a in s1:
        return a
    if b in s1:
        return b
    if a in s2:
        return a
    if b in s2:
        return b
    return a
复制代码

逻辑和之前完全一致,但是代码清晰了很多。

从这个例子中,我品尝到数学的快乐,坚定了我继续学下去的信念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值