Изменить определение функции на основе условия - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь определить условную функцию, определение которой зависит от входного значения.Я также хочу, чтобы он выполнялся на нескольких различных входных данных, содержащихся в списке.

Вывод, который я получаю, не соответствует ожиданиям.Для следующих входных данных: доход = [500, 1500, 4000] Я ожидаю, что выход будет: 50, 200, но фактические результаты: -150, 150 и 900 соответственно.Результаты, которые я ожидал:Я получаю правильную информацию, когда вписываю в список только одно значение дохода.

incomes = [500, 1500, 4000]
for current_income in incomes:
    income = current_income
    if income <1000:
        def tax(income):
            return income*0.1
    elif 1000<=income<2000:
        def tax(income):
            return 1000*0.1 +(income-1000)*0.2
    else:
        def tax(income):
         return 1000*0.1+ 1000*0.2 + (income-2000)*0.3

for i in incomes:
    result = tax(i)
    print(result)

Кажется, что порядок значений в списке имеет значение: я изменил порядок доходов в списке, я получаю выходные данные: 400, 150, 50. Я понимаю, что проблема заключается ввзаимодействие цикла for и if, elsif и другие условия, но я не вижу, что на самом деле не так в моем коде.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Проблема в том, что вы продолжаете переопределять функцию tax.Когда вы заканчиваете свой первый цикл for, все, что вы определили как последний раз, - это то, с чем вы в итоге справились.

Самый простой обходной путь - поместить проверку внутри функции, как показано в другом ответе.

Если вам по какой-то причине необходимо условно создать функцию, вам придется реструктурировать ее так, чтобы она использовалась до ее переопределения.

0 голосов
/ 03 января 2019

Почему вы условно создаете функции?Используйте один и решите внутри него, какой налог применяется на основе того, какой доход вводится в него:

def tax(income):
    if income < 1000:
        return income*0.1
    elif 1000 <= income < 2000:
        return 1000*0.1 +(income-1000)*0.2             # 100 + ...
    else:
        return 1000*0.1 + 1000*0.2 + (income-2000)*0.3 # 300 + ...


incomes = [500, 1500, 4000]

for i in incomes:
    result = tax(i)
    print(result)

Вывод:

50.0
200.0
900.0

Чтобы использовать «переопределенные функции» какпопытаться вам нужно было бы поместить оператор печати в тот же цикл, чтобы воспользоваться преимуществами определенной в настоящее время tax функции.

(ОЧЕНЬ плохой СТИЛЬ!)

incomes = [500, 1500, 4000]
for i in incomes: 
    if i <1000:
        def tax(income):
            return income*0.1
    elif 1000<=i<2000:
        def tax(income):
            return 1000*0.1 +(income-1000)*0.2
    else:
        def tax(income):
            return 1000*0.1+ 1000*0.2 + (income-2000)*0.3

    # use the tax function that _currently_ is valid for `tax`
    result = tax(i)
    print(result)
...