python学习——练习题(2)
""" 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成, 从键盘输入当月利润I,求应发放奖金总数? """ import re def calculate1(profit): """ 自己的解答,直接使用最简单的思路 """ print("奖金计算一的结果", end=":") if profit < 0: print("利润不能小于0") elif 0 <= profit <= 100000: print("%.2f*0.1=%.2f" % (profit, profit * 0.1)) elif 100000 < profit <= 200000: print("(%.2f-100000)*0.075+10000=%.2f" % (profit, (profit - 100000) * 0.075 + 10000)) elif 200000 < profit <= 400000: print("(%.2f-200000)*0.05+10000+7500=%.2f" % (profit, (profit - 200000) * 0.05 + 10000 + 7500)) elif 400000 < profit <= 600000: print("((%.2f-400000)*0.03+10000+7500+10000=%.2f" % (profit, (profit - 400000) * 0.03 + 10000 + 7500 + 10000)) elif 600000 < profit <= 1000000: print("((%.2f-600000)*0.015+10000+7500+10000+6000=%.2f" % (profit, (profit - 600000) * 0.015 + 10000 + 7500 + 10000 + 6000)) else: print("((%.2f-1000000)*0.01+10000+7500+10000+6000+6000=%.2f" % (profit, (profit - 1000000) * 0.01 + 10000 + 7500 + 10000 + 6000 + 6000)) def calculate2(profit): """ 参考答案,通过循环已排序好的阶段值列表,来计算总奖金 """ print("奖金计算二的结果", end=":") if profit < 0: print("利润不能小于0") return profitRank = (1000000, 600000, 400000, 200000, 100000, 0) profitRate = (0.01, 0.015, 0.03, 0.05, 0.075, 0.1) tempProfit = profit sumBonus = 0 for i in range(0, 6): if tempProfit > profitRank[i]: rankBonus = (tempProfit - profitRank[i]) * profitRate[i] sumBonus += rankBonus tempProfit = profitRank[i] if i == 5: print("%.2f" % rankBonus, end="=") else: print("%.2f" % rankBonus, end="+") print("%.2f" % sumBonus) def calculate3(profit): """ 利用sum方法计算,总金额, 其中还用到了zip,map,filter,join等函数 """ print("奖金计算三的结果", end=":") if profit < 0: print("利润不能小于0") return profitRank = [1000000, 600000, 400000, 200000, 100000, 0] profitRate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1] profitCalc = [0, 0, 0, 0, 0, 0] tempProfit = profit for i in range(0, 6): if tempProfit > profitRank[i]: profitCalc[i] = tempProfit - profitRank[i] tempProfit = profitRank[i] pList = zip(profitCalc, profitRate) bonusList = map(lambda p: p[0] * p[1], pList) bonusList = list(filter(lambda f: f > 0, bonusList)) bonus = sum(bonusList) bonusStrList = map(lambda f: "{:.2f}".format(f), bonusList) print("%s=%.2f" % ("+".join(bonusStrList), bonus)) def calculate4(profit): """ 利用列表的切片来实现计算 :param profit: :return: """ print("奖金计算四的结果", end=":") if profit < 0: print("利润不能小于0") return profitRank = [1000000, 600000, 400000, 200000, 100000, 0] profitRate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1] profitCalc = [400000, 200000, 200000, 100000, 100000] for i in range(0, 6): if profit > profitRank[i]: profitRate = profitRate[i:] profitCalc = profitCalc[i:] profitCalc.insert(0, profit - profitRank[i]) break pList = zip(profitCalc, profitRate) bonusList = map(lambda p: p[0] * p[1], pList) bonusList = list(filter(lambda f: f > 0, bonusList)) bonus = sum(bonusList) bonusStrList = map(lambda f: "%.2f" % f, bonusList) print("%s=%.2f" % ("+".join(bonusStrList), bonus)) def calculate5(profit): """ 利用嵌套列表实现,其实和calculate2差不多,只不过是把两个列表组合到一个嵌套列表中 :param profit: :return: """ print("奖金计算五的结果", end=":") if profit < 0: print("利润不能小于0") return profitRank = [[1000000, 0.01], [600000, 0.015], [400000, 0.03], [200000, 0.05], [100000, 0.075], [0, 0.1]] profitTemp = profit bonus = 0 for i in range(0, 6): if profitTemp > profitRank[i][0]: bonusRank = (profitTemp - profitRank[i][0]) * profitRank[i][1] bonus += bonusRank profitTemp = profitRank[i][0] if i == 5: print("%.2f" % bonusRank, end="=") else: print("%.2f" % bonusRank, end="+") print("%.2f" % bonus) def calculate6(profit): """ 利用字典计算奖金,类似calculate5,只是将嵌套列表换成字典 中间用到了,列表的排序方法sort和倒序方法reverse :param profit: :return: """ print("奖金计算六的结果", end=":") if profit < 0: print("利润不能小于0") return profitDict = {1000000: 0.01, 600000: 0.015, 400000: 0.03, 200000: 0.05, 100000: 0.075, 0: 0.1} # dict.keys()返回的事迭代器 profitKey = list(profitDict.keys()) profitKey.sort() profitKey.reverse() profitTemp = profit bonus = 0 for i in range(0, len(profitKey)): if profitTemp > profitKey[i]: bonusRank = (profitTemp - profitKey[i]) * profitDict[profitKey[i]] bonus += bonusRank profitTemp = profitKey[i] if i == len(profitKey) - 1: print("%.2f" % bonusRank, end="=") else: print("%.2f" % bonusRank, end="+") print("%.2f" % bonus) def calculate7(profit, s): """ 利用递归来计算奖金,类似calculate1 :param s: :param profit: :return: """ if s == 0: print("奖金计算七的结果", end=":") if profit < 0: print("利润不能小于0") return elif 0 <= profit <= 100000: bonus1 = bonus = profit * 0.1 elif 100000 < profit <= 200000: bonus1 = (profit - 100000) * 0.075 bonus = bonus1 + calculate7(100000, 1) elif 200000 < profit <= 400000: bonus1 = (profit - 200000) * 0.05 bonus = bonus1 + calculate7(200000, 1) elif 400000 < profit <= 600000: bonus1 = (profit - 400000) * 0.03 bonus = bonus1 + calculate7(400000, 1) elif 600000 < profit <= 1000000: bonus1 = (profit - 600000) * 0.015 bonus = bonus1 + calculate7(600000, 1) else: bonus1 = (profit - 1000000) * 0.01 bonus = bonus1 + calculate7(1000000, 1) if s == 0: print("%.2f" % bonus1, end="=") print("%.2f" % bonus) else: print("%.2f" % bonus1, end="+") return bonus def answer(): """ 解题答案,输入利润,然后调用计算方法计算利润 不过在计算前,需要判断一下输入的是数值类型的,因为input输入的都是str类型 str为字符串 str.isalnum() 所有字符都是数字或者字母 str.isalpha() 所有字符都是字母 str.isdigit() 所有字符都是数字 str.islower() 所有字符都是小写 str.isupper() 所有字符都是大写 str.istitle() 所有单词都是首字母大写,像标题 str.isspace() 所有字符都是空白字符、\t、\n、\r 上述的主要是针对整型的数字,但是对于浮点数来说就不适用了,那么浮点数怎么判断呢, 1.通过异常来判断,try: f = float(str) exception ValueError: print("输入的不是数字!") 2.通过正则表达式来判断:'^[-+]?[0-9]+(\.[0-9]+)?$ """ profit = input("输入利润金额:") if profit == "q": return reg = re.compile('^[-+]?[0-9]+(\.[0-9]+)?$') result = reg.match(profit) if result: profitFloat = float(profit) calculate1(profitFloat) calculate2(profitFloat) calculate3(profitFloat) calculate4(profitFloat) calculate5(profitFloat) calculate6(profitFloat) calculate7(profitFloat, 0) else: print("Error:输入的不是数值。") print("继续,或输入q推出") answer() answer()