第十四节 应用案例(二)
大家好!接着昨天的案例分析,今天我们继续讲解新的案例。
案例4、根据销售额计算奖金
需求:
(网络案例)某企业实行阶梯制销售绩效方案,规定奖金按业绩计算的规则如下:
(1)销售额低于或等于10万的部分,计提10%;
(2)销售额超过10万,低于或等于20万的部分,计提7.5%;
(3)销售额超过20万,低于或等于40万的部分,计提5%;
(4)销售额超过40万,低于或等于60万的部分,计提3%;
(5)销售额超过60万,低于或等于100万的部分,计提1.5%;
(6)销售额超过100万的部分,计提1%。
项目要求:输入某人的销售额,立即得出应发奖金。
需求分析:
(1)我们需要特别注意的是奖金计算规则是按业绩分段设计的,也就是说跨段位的业绩奖金计算需要分段求和,而不是只按最高标准计算。
(2)理解了分段求和问题,解决办法就是:根据业绩覆盖的范围,分段计算,再相加。
(3)判断业绩覆盖的范围,肯定是用分支语句啦。
根据销售额计算奖金源代码:
代码解析:
(1)第一行,不用说了,就是用来接收用户输入一个业绩数字的啦,float()是干嘛的?这个(尴尬)...数据类型转换啊,不是说了input()接收到的都是字符串吗?咱们要处理的可是数字哦,而且,很可能是小数哦,毕竟是万元为单位的嘛,小数点后面的1都是1000大洋啊。
(2)知道分支语句都是if...elif...elif...但是第一个if从哪开始呢?当然是从最小的第一个分段指标10万以内开始判断啦,条件成立,那么这一段的业绩计提10%,OK?下一段呢,那当然就是elif了,判断10万以上,20万以内的啦,条件成立,那么这一段的业绩计提7.5%。这样就完了吗?当然不能完!不然还不如只卖10以内呢,高段位的业绩意味着它一定覆盖(包含)着上一段位的业绩,这个没争议,对吧?所以,上一段位的业绩奖金肯定也得要啊!这个千万不能忽略哦,算漏了会出人命的(都是血汗钱呀)!
(3)OK,以此类推,继续elif,当然是所有可能性都需要判断出来呀,万一你又漏掉哪种可能性,那么,大概率的事件就是强大的销售团队反馈回来的战况一定会恰好覆盖了你遗漏的那种可能的情况,然后,结果会怎么样?还能咋样?出bug了呗!所以,写分支语句,啥最重要?全覆盖最重要!这就叫“穷举思维”。(赶紧脑补一下中学语文中逻辑课里讲到的“穷举法”,多少有点印象吧?)
(4)最后不用说了吧,显示奖金额度,显摆呗!体验一下拆红包的感觉吧。
案例5、编写一个冒泡排序函数
需求:冒泡排序法是一种经典的排序算法模型,请使用python语言编写一个冒泡排序算法的函数,并能支持任意的一维序列对象实现排序,支持有相同大小的元素。
需求分析:
(1)冒泡排序的一般算法是:遍历一个序列,每取一个元素,与剩下的其余所有元素进行比较,如果发现有比它更小的就替换,比较结束后将获得本轮循环的一个最小值,然后,继续迭代,对剩余的集合采用相同的办法,依次获得最小值,一并添加到新的列表中,最后得出一个从小到大的列表。
(2)冒泡排序算法通常有迁移法和交换法两种,我们这里会演示两种算法。
(3)需要注意,因为需要支持相同大小的元素,所以,不要使用集合类型的数据结构。
1、迁移法源代码
代码解析:
(1)既然要求编写一个排序函数,那就创建一个函数呗,名字...就叫orderby()算啦,为什么要用函数?(尴尬!)好吧,再强调一遍:函数是可以被反复重用的代码块,当且仅当它被调用时才会执行!兄弟,函数的重要性还真不能过目就忘了。
(2)x=list(x),这是啥?显然是将函数传值进来的参数x(它一定是一个可排序的数据序列)转换为list列表啊,为什么要转?还不是因为前面刚刚讲过的四大数据结构之首list列表,对它操作极其方便啊,干啥都行!别想歪了。
(3)然后呢,y=[],这个要是不认识,那就赶紧面壁去吧。创建一个备用的空列表y,马上你就会知道它的用处了。你问我怎么知道要提前在这儿准备个y呢?我去,不是我先知先觉好吧,还不都是无数次碰壁长记性了呗,所以,万一你今后写代码一下子写的不完美,那就叫正常,因为你是人,练成“大神”总是有些路要走的。别急,一步一步来。
(4)接下来的代码才是你要集中注意力去解读的部分,首先,注意它有两层循环嵌套,第一层while循环,遍历我们的x列表,这个肯定没问题,按照冒泡排序的基本思路,每一个值都是要拿出来比较一下大小的嘛,OK,拿到了一个,赋值给xi。
(5)然后开始下一轮循环,这是一个对当前x列表进行迭代的for循环,每一次迭代,取其一个元素xj,与xi相比较,如果遇到了较小的xj,我们就将它的值替换到xi中(赋值给xi),直到for循环迭代结束,我们就找到了当前x列表中最小的xi。
(6)然后,两件事:第一将xi添加到备用的列表y中;第二,从现有的x列表中移除当前的xi值。至此,while的一轮循环结束,x的列表长度也会减一。
(7)程序当然没结束,while循环还会继续,直到x的长度为0,退出循环。x这个列表对象看起来应该为空了,但是,新的y列表是不是丰满起来了呢?且y的所有元素都来自于x,但是,它是有序的,从小到大的排列整齐!怎么样?你信不信?反正我是信了的。
(8)如果你还是不信,OK,辛亏写的是一个函数,你来调用它试试,随便输入一串数字,或者字符串也是可以的,没错,最后的代码就是这个意思啦!
(9)最后,疑惑当初为什么要整一个y=[]留着,现在明白它的用意了吧,套路深着呢~
归纳一下:
迁移法的基本算法原理就是,遍历一个无序的列表,首先取第一个值,并将它与其他所有的值进行比对,遇到比它更小的,就把它提溜出来,并继续比对。一轮下来,“浮到最上面”来的那个值就是这一轮中最小的,然后将它移出列表,并添加到一个新的列表中。依次类推,继续在剩下的序列中寻找较小的值,直到清空原始序列,那么,我们得到的那个新列表就是实现排序后的列表。
2、交换法源代码
交换法的算法原理,与迁移法的基本相同。只是,它并不需要定义一个新的列表,用于存放“浮出水面”的较小元素,而是,单纯通过交换索引位置,让较小的值排列到靠前的位置,最后实现排序。
有了迁移法的基础,节约时间,交换法的代码我就不详细解析了,免得有人(嫌我啰嗦)又想扔蛋!大家有兴趣自行揣摩一下吧,实在有不明白的,可以留言给我哦。
另外,还是说出来吧,Python有自己内置的排序函数list.sort(),可以直接对列表对象完成排序。(看看,这回不是扔鸡蛋了,有人已经攥紧拳头了!我真不是要折腾你们,难道你不觉得自己手写一套排序算法出来,马上就自信心爆棚,感觉牛逼轰轰的吗?)
下面,讲案例6,哦,不,刚才看到那个攥紧的拳头,还是算了,今天就到这里吧。不是我不想讲,案例6有点那个...稍微复杂一点,为了不影响大家耐心揣摩冒泡排序的交换法算法,我们明天再继续吧,案例6是个好东西,咱们明天可以花整块的时间来消化它,OK?
小结
今天我们分享了2个小案例,一个面向企业应用,一个面向编程算法,都是非常有意义的代码设计和训练。请大家课后一定要反复训练,代码永远是越写越牛的,不是看看就牛的。
任何问题,记得留言哦。