Python算法100例-2.4 个人所得税

完整源代码项目地址,关注博主私信'源代码'后可获取

1.问题描述

编写一个计算个人所得税的程序,要求输入收入金额后,能够输出应缴的个人所得税。个人所得税征收办法如下:

起征点为2000元。

·不超过500元的部分,征收5%。

·超过500~2000元的部分,征收10%。

·超过2000~5000元的部分,征收15%。

·超过5000~20000元的部分,征收20%。

·超过20000~40000元的部分,征收25%。

·超过40000~60000元的部分,征收30%。

·超过60000~80000元的部分,征收35%。

·超过80000~100000元的部分,征收40%。

·超过100000元以上的,征收45%。

2.问题分析

分析题目特点,我们可以考虑使用Python语言的列表和元组来描述题目中的条件。下面先讲解Python语言中列表和元组的语法要点。

(1)列表

列表是以方括号“[]”包围的数据集合,列表元素之间使用逗号“,”分割。列表的元素类型可以是任何数据类型,也可以包含另一个列表,可以通过列表的下标来访问列表中的元素,下标从0开始。列表的内容是可变的,定义一个列表如下:

list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

其中list[0]=1,list[1]=2,以此类推。

使用for语句遍历这个列表如下:

for i in list:
    print(i, end=" ")
1 2 3 4 5 6 7 8 9 

将会打印出:1 2 3 4 5 6 7 8 9。

下面是列表常用的操作方法。

·list.append(x):添加元素,将元素x添加到列表list的尾部。

·list.extend(aList):添加元素,将列表aList中的所有元素添加到列表list的尾部。

·list.insert(index,x):添加元素,在列表list中的指定位置index处插入元素x。

·list.remove(x):删除元素,在列表list中删除首次出现的指定元素x。

·list.pop([index]):删除元素,删除并返回列表list中指定位置index处的元素,默认是最后一个元素。

·list.clear():删除元素,删除列表中的所有元素,并不是删除列表对象。

·list.index(x):返回第一个x的索引位置,若不存在x元素则抛出异常。

·list.index(x1,x2):从索引位置x2开始往后搜索的第一个x1。

·list.count(x):返回指定元素x在列表list中出现的次数。

·len(list):返回列表中包含元素的个数。

·list.reverse():翻转列表,所有元素原地翻转。

·list.sort():对原列表进行排序,默认是升序。

·list.sort(reverse=True):降序排序。

·list.copy():返回列表对象的浅复制。

(2)元组

Python的元组与列表相似,元组是以圆括号“()”包围的数据集合。与列表不同的是元组的元素一旦确定就不能再改变,它是不可变数据类型。因此它常常被用在不希望数据被其他操作所改变的场景中。

如果圆括号中不包含任何内容,就是一个空元组。

定义一个元组如下:

tuple = ('a', 'b', 'c', 'd')

遍历元组如下:

for i in tuple:
    print(i, end=" ")
a b c d 

将会打印输出:a b c d。

3.算法设计

根据列表和元组的相关知识,这里可以同时使用列表和元组来存放不同的税率范围。接着使用for循环遍历每一个征税范围,将个人收入中超出起征点的金额在每个征税范围内应缴纳的税款累加起来,就得到最后应缴纳的个人所得税。

4.确定程序框架

(1)定义列表TaxTable

其中,元素类型使用元组,该列表描述了征税的范围及对应不同范围的税率。定义如下:

#分为9个阶段,每个阶段第一个值为个税起征点,第二个值为该阶段截止点,第三个值为税率
TaxTable = [(0, 500, 0.05),
            (500, 2000, 0.10),
            (2000, 5000, 0.15),
            (5000, 20000, 0.20),
            (20000, 40000, 0.25),
            (40000, 60000, 0.30),
            (60000, 80000, 0.35),
            (80000, 100000, 0.40),
            (100000, 1e10, 0.45)]

(2)定义计算税率的函数CaculateTax()

其中,profit为个人收入,TAXBASE是个税起征点。profit-TAXBASE是个人收入中超出个税起征点的部分,仍存入profit变量中,在CaculateTax()中要计算出这部分收入的纳税金额。

#计算税收
def CaculateTax(profit):
    tax = 0.0
    profit -= TAXBASE                                                       # 超过个税起征点的收入
    i = 0
    for i in range(len(TaxTable)):
        # 判断profit是否在当前的缴税范围内
        if (profit > TaxTable[i][0]):
            if (profit > TaxTable[i][2]): # profit超过当前的缴税范围
                tax += (TaxTable[i][1] - TaxTable[i][0]) * TaxTable[i][2]

            else:                                                           # profit未超过当前的缴税范围
                tax += (profit - TaxTable[i][0]) * TaxTable[i][2]

            profit -= TaxTable[i][1]
            if profit < 0:
                profit = 0

            print("征税范围:%6d~%6d  该范围内缴税金额:%6.2f  超出该范围的金额:%6d" % (TaxTable[i][0], TaxTable[i][1], tax, profit))
    return tax


在CaculateTax()函数中使用了for循环,循环变量为i,循环次数与TaxTable数组中的元素个数相同。在循环体中用profit(注意此时的profit中存放的是个人收入中超过个税起征点的部分)与征税范围做比较,如果TaxTable[i][1]>profit>TaxTable[i][0],即profit恰好处于某个范围内,则在该范围内应缴税金额为:(profit-TaxTable[i][0])*TaxTable[i][2];如果profit>TaxTable[i][1],则在该范围内应缴税金额为:(TaxTable[i][1]-TaxTable[i][0])*TaxTable[i][2]。

使用for循环将每个征收范围遍历一遍,将各个范围内产生的缴税金额累加起来,就得到应该缴纳的个人所得税的总金额。

CaculateTax()函数的流程图如图所示。

在这里插入图片描述

5.完整的程序

根据上面的分析,编写程序如下:

%%time
# 个人所得税问题

TAXBASE = 2000

#分为9个阶段,每个阶段第一个值为个税起征点,第二个值为该阶段截止点,第三个值为税率
TaxTable = [(0, 500, 0.05),
            (500, 2000, 0.10),
            (2000, 5000, 0.15),
            (5000, 20000, 0.20),
            (20000, 40000, 0.25),
            (40000, 60000, 0.30),
            (60000, 80000, 0.35),
            (80000, 100000, 0.40),
            (100000, 1e10, 0.45)]

#计算税收
def CaculateTax(profit):
    tax = 0.0
    profit -= TAXBASE                                               # 超过个税起征点的收入
    i = 0
    for i in range(len(TaxTable)):
        # 判断profit是否在当前的缴税范围内
        if (profit > TaxTable[i][0]):
            if (profit > TaxTable[i][2]):        # profit超过当前的缴税范围
                tax += (TaxTable[i][1] - TaxTable[i][0]) * TaxTable[i][2]

            else:                                                   # profit未超过当前的缴税范围
                tax += (profit - TaxTable[i][0]) * TaxTable[i][2]

            profit -= TaxTable[i][1]
            if profit < 0:
                profit = 0

            print("征税范围:%6d~%6d  该范围内缴税金额:%6.2f  超出该范围的金额:%6d" % (TaxTable[i][0], TaxTable[i][1], tax, profit))
    return tax

if __name__ == '__main__':
    print("请输入个人收入金额: ", end='\n')
    profit = int(input())
    print(f'输入的金额为:{profit}','\n')
    tax = CaculateTax(profit)
    print("您的个人所得税为 %12.2f" % tax)


请输入个人收入金额: 
输入的金额为:5678 

征税范围:     0~   500  该范围内缴税金额: 25.00  超出该范围的金额:  3178
征税范围:   500~  2000  该范围内缴税金额:175.00  超出该范围的金额:  1178
您的个人所得税为       175.00
CPU times: user 27.6 ms, sys: 6.23 ms, total: 33.8 ms
Wall time: 2.91 s
  • 34
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘逸高铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值