为什么要写这篇文章
问题来源:网友求助
今天刚好收到一位网友的问题求助,让我帮忙实现一个级差分佣的算法。
因为之前我写过一篇文章 小程序后端开发之《PHP级差分佣系统功能》
这位网友认真的看了我这篇文章,而又恰好最近他在开发关于级差分佣的功能。所以就到我博客主页来提问了。就是大概这么个经过。
问题的描述:九级订单分佣
如果还有不了解什么是级差分佣的请点上面链接,看下我写的那篇文章。
我先把这位网友同学的问题大致描述下吧。
他开发的级差佣金分佣系统也是按每日订单的数量来分级返佣,所以佣金也是根据订单级别来设置的。只不过他开发的是Python程序。
下面是佣金分佣级别,以及每个级别的订单数量和具体佣金金额。
级别 | 订单数 | 佣金 |
---|---|---|
一级 | 1-100 | 0.5元 |
二级 | 101-300 | 0.8元 |
三级 | 301-600 | 1.1元 |
四级 | 601-1000 | 1.3元 |
五级 | 1001-2000 | 1.5元 |
六级 | 2001-5000 | 1.7元 |
七级 | 5001-10000 | 1.8元 |
八级 | 10001-20000 | 1.9 |
九级 | 20000以上 | 2元 |
问题注意点及要求
1.比如某人的订单数是200,那么他的佣金是100*0.5+100*0.8=130元。
2.用python来实现
他想要达到的结果
向函数里传入一个当日某人的订单数,来计算应该给他分多少佣金。
问题分析:数轴定位分析
这个问题确实和我写的文章有点类似
但也不是完全一样:因为从他的例子中可以看出,当一个人的订单数是200单时,0-100的订单是以0.5元/单来计算,而101-300的订单是按0.8元/单来计算的。
下面我们开始来用数轴分界和定位法分析,并用python代码来实现。
实现代码:Python实现
哪这个问题要怎么写代码呢?
首先我们定义一个函数differential()
,并利用input
向这个函数中传入当日订单数;
def differential(i):
n = int(input('当日订单数:'))
differential(n)
下面我们来实现这个函数里的功能:
我们先把等级所需的订单数设置为数组arr
,作为分界数轴,方便后面来定位。
arr = [20000,10000,5000,2000,1000,600,300,100,0]
接下来把每个级别的佣金也用数组rat
存入。
rat = [2,1.9,1.8,1.7,1.5,1.3,1.1,0.8,0.5]
可能有同学要问为什么arr
rat
两个数组是倒序存入的。至于为什么是倒序。
这是因为接下来我们要用一个for
来从高级别向底级别定位,这样就可以实现数轴分界及定位分析。
举个例:
有某个人的当日订单数是
200
单,那我们怎么分析呢,是不是先判断这个200
是在那个等级区间中,我们发现他在100-300
这个区间,这时我们是不是开始计算在100-300
这个区间应该分佣多少。
是不是200-100=100单
,这样就可以算得这个区间的分佣为100*0.8=80元
,而为什么是减100
呢,是不是这100又是在区间0-100
里面。然后根据这个区间来判断,这时我们是不是又可以算得0-100
这个区间分佣金额为100*0.5=50元
。这样我们就得到了总分佣为80+50=130元
,所以我们是倒序定位分界数轴的,也就是先判断高级别,再判断低级别,现在应该明白了吧。
下面来看看这个for
要怎么写;
我们的分界数轴长度是9,所以我们要定位9次才能定位完所有级别。
for idx in range(0,9):
同时我们设置r
来接收最后累计的分佣金额。
接下来我们通过if
来判断输入的值是不是在某个级别的区间上限外。
if i>arr[idx]:
如果是的话,我们开始计算在这个区间中的佣金。
r+=(i-arr[idx])*rat[idx]
为了看到过程,我们打印下。
print ((i-arr[idx])*rat[idx],i)
接下来是把输入的值往下个级别倒退,所以我们把arr[idx]
赋值给i
i=arr[idx]
最后把总佣金通过return
返回。
下面是整个代码:
#!/usr/bin/python3
def differential(i):
arr = [20000,10000,5000,2000,1000,600,300,100,0]
rat = [2,1.9,1.8,1.7,1.5,1.3,1.1,0.8,0.5]
r = 0
for idx in range(0,9):
if i>arr[idx]:
r+=(i-arr[idx])*rat[idx]
print ((i-arr[idx])*rat[idx],i)
i=arr[idx]
return r
n = int(input('当日订单数:'))
differential(n)
结果输出:过程结果打印
上面的代码运行后将输出如下结果:
首页会要求输入当日订单数:比如输入200
当月订单数:200
80.0 200
50.0 100
130.0
也就是说:0-100的订单是以0.5元一单结算,佣金为50元,101-300之间的订单是以0.8元一单结算,佣金是80,最后总佣金为130。
问题总结:举一反三
其实我们不难看出,这类问题都是通过数轴来进行分界的,然后我们定位到相应的分界数轴里面,就可以实现这类的算法。