根据条件更改功能定义

时间:2019-01-03 20:27:48

标签: python function for-loop if-statement

我试图定义一个条件函数,该函数的定义取决于输入值。我还希望它在列表中包含的几个不同输入上运行。

我得到的输出不是我期望的。对于以下输入:收入= [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和else条件的交互,但是我看不出代码中实际上有什么错误。

2 个答案:

答案 0 :(得分:3)

为什么要有条件地创建函数?使用其中一种,并根据输入的收入来决定在其中应用什么税种:

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

要尝试使用“重新定义的函数”,您需要将print语句放入同一循环中,以从当前定义的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)

答案 1 :(得分:1)

问题在于您不断重新定义tax函数。当您完成第一个for循环时,最后一次定义的内容就是您的最终结果。

最简单的解决方法是将支票放入函数中,如其他答案所示。

如果由于某种原因需要有条件地创建函数,则必须重新组织事物,以便在重新定义函数之前使用该函数。