Здесь используется короткая программа для расчета налогов.
boundaries = [0, 9525, 38700, 82500, 157000, 200000, 500000]
percentages = [ .10, .12, .22, .24, .32, .35, .37]
sal = salary = 142000
bot_top = zip(boundaries, boundaries[1:]+[salary])
sal_in_brkt = (top-bot if sal>top else max(sal-bot,0) for bot, top in bot_top)
taxes = sum(pct*inbrkt for pct, inbrkt in zip(percentages, sal_in_brkt))
print(salary, taxes, salary-taxes) # ⇒ 142000 28369.5 113630.5
bot_top
создает кортежи с нижним и верхним крайностями каждой налоговой скобки (обратите внимание, что верхняя часть последней скобки принимается равнойк самой зарплате).
sal_in_brkt
производит доли зарплаты, которые находятся между верхом и низом каждой скобки.
taxes
является суммой произведенных в скобках долей зарплатыраз соответствующий процент.
Для обобщения процедуры ниже определена функция make_taxes
, которая принимает в качестве необязательных аргументов список boundaries
для налоговых скобок и список percentages
, который применяется к доходу внутриконкретная налоговая скобка.
Список границ начинается с минимального дохода, к которому мы применяем налогообложение (в примере это 0), и заканчивается максимальным значением, при котором налогообложение является постоянным.Если у нас есть границы N , то число скобок, принимая во внимание, что значение больше максимального, равно N , поэтому мы утверждаем, что длины двух списков должны быть равны.
Функция make_taxes
в конечном итоге возвращает функцию, которая возвращает налогообложение для данной зарплаты.
def make_taxes(boundaries=None, percentages=None):
boundaries = boundaries or [0, 9525, 38700, 82500, 157000, 200000, 500000]
percentages = percentages or [ .10, .12, .22, .24, .32, .35, .37]
assert len(boundaries) == len(percentages)
def taxes(salary):
s = salary
pct_bot_top = zip(percentages, boundaries, boundaries[1:]+[s])
return sum(p*(t-b if s>t else max(s-b, 0)) for p,b,t in pct_bot_top)
return taxes
print(make_taxes()(142000)) # ⇒ 28369.5