Как увеличить что-то в несколько раз? - PullRequest
0 голосов
/ 17 октября 2019

Итак, у меня есть это тело кода:

 def effective_rate(db : {str: {(int,int) : float}}, state : str, income : int ) -> float:
        tax = 0
        for state in db.values():
            for(lower_limit, higher_limit), tax_rate in state.items():
                if (income >= lower_limit):
                    tax = tax + (tax_rate*(higher_limit - lower_limit))
                    if (income <= higher_limit):
                        tax = tax + (tax_rate*(income-lower_limit)) 
                        return tax

, и это для проверки моего кода:

db1 = {'CT': {(      0,  12_499): .02,
                      ( 12_500,  49_999): .04, 
                      ( 50_000,    None): .06},

               'IN': {(0, None): .04},

               'LA': {(      0,   9_999): .03,
                      ( 10_000,  12_499): .05,
                      ( 12_500,  49_999): .055,
                      ( 50_000, 299_999): .06,
                      (300_000,    None): .078},

                'MA': {(0, None): .055}}
        answer = effective_rate(db1,'CT',40_000)

Проблемы, с которыми я сталкиваюсь, состоят в том, что мой результат должен напечатать 0.0337495 Еще одна проблема заключается в том, что если значение_произведения равно None, оно поднимает TypeError: unsupported operand type(s) for -: 'NoneType' and 'int' Как я могу сделать так, чтобы оно увеличивалось более одного раза для оператора if и правильно? И как остановить ошибку от поднятия?

1 Ответ

0 голосов
/ 17 октября 2019

Используйте более простую структуру данных. Вместо того чтобы пытаться определить обе конечные точки налоговой скобки, просто запомните нижние конечные точки, поскольку каждая скобка проходит до нижней конечной точки следующей скобки. (Подумайте, что произойдет, если доход составит 49 999 долларов и несколько центов!) Затем следующая проблема заключается в том, что логика неверна:

            if (income >= lower_limit):
                tax = tax + (tax_rate*(higher_limit - lower_limit))
                if (income <= higher_limit):
                    tax = tax + (tax_rate*(income-lower_limit)) 
                    return tax

Если доход находится в некоторой скобке, это сначала добавит предельный налогдля всей шкалы, в дополнение к предельному налогу до уровня дохода - требуется только вторая часть.

В качестве альтернативы, мы можем упростить, сохранив различия в ставках налога для каждогоскобка. Например, в 'LA' мы можем сделать:

'LA': ((0, .03), # all income is taxed at least 3%
       (10_000, .02), # income $10k and above is taxed an additional 2%
       (12_500, .005), # and so on
       (50_000, .005),
       (300_000, .018)),

Заметьте, я не использую dict, а вместо этого кортеж из 2-х кортежей. Причина в том, что мы должны быть уверены в порядке скобок, и мы в любом случае не используем эти данные в качестве словаря - мы не хотим решать проблему "какова ставка налога длязаданную скобку? ", потому что мы будем итеративно рассматривать скобки.

План состоит в том, чтобы доход выше 300 тыс. кумулятивно облагался налогом 7,8%: 6% от всех предыдущих шагов, а затем 1,8% в последнемшаг. Для этого нам просто необходима логика:

    for bottom_of_bracket, tax_rate in state.items():
        if income >= bottom_of_bracket:
            tax += tax_rate * (income - bottom_of_bracket)
        # it doesn't matter if some brackets are above the income,
        # because they will fail the if condition.
    # only after considering all the brackets do we have the final tax.

Последнее соображение заключается в том, что мы можем только один раз вернуться из функции. Вы написали это, чтобы перебрать все состояния в db, но мы заботимся только об одном из них - о том, что называется state, переданном функции. Используйте это для поиска правильных данных о состоянии в db ( сейчас мы используем dict s для чего они нужны :)).

...