Python if语句故障排除

时间:2013-09-18 22:37:02

标签: python python-2.7

Python版本:2.7

只是想知道以下代码有什么问题:

def bmi_cat(bmi):
    if bmi < 18.5:
        return "underweight"
    elif (bmi >=18.5 or bmi < 25):
        return "normal"
    elif (bmi >=25 or bmi < 30):
        return "overweight"
    else:
        return "obese"

基本上如果我输入17它会给我正确的答案,但它给我正常的18.5以上的任何东西(3000给予正常而不是肥胖等...)

4 个答案:

答案 0 :(得分:6)

您希望and不是or ...它需要满足两个条件......您也可以将其作为if 18.5 <= bmi < 25以Python编写它更清楚,避免这种情况......

另外,请考虑查看http://docs.python.org/2/library/bisect.html哪些可以为您做这类事情,并且如果您的范围更大,则会更好地扩展。看看grade example

答案 1 :(得分:4)

这是因为您正在使用or。如果bmi >= 18.5为真,则第一个elif的整个条件将为真。请改用and

或者更好的是,在一个中包含两个条件。当第一个elif到达时,你知道 bmi >= 18.5,如果它不是,那么第一个如果已输入。因此,我们可以将其重写为

if bmi < 18.5:
    return "underweight"
if bmi < 25:
    return "normal"
if bmi < 30:
    return "overweight"
return "obese"

我们也不需要elif,因为return结束了此功能。

答案 2 :(得分:2)

应该是:

def bmi_cat(bmi):
    if bmi < 18.5:
        return "underweight"
    elif (bmi >=18.5 and bmi < 25):
        return "normal"
    elif (bmi >=25 and bmi < 30):
        return "overweight"
    else:
        return "obese"

如果你检查:

elif (bmi >=18.5 or bmi < 25):

对于大于或等于18.5

的每个值,它都给出True

答案 3 :(得分:1)

>=表示“大于或等于”。因此bmi >= 18.5对于任何等于18.5或更高的数字都是正确的。

因为您使用了布尔运算符or,所以如果数字是18.5或更高,则整个语句将为true。因此为什么它适用于3000.

您可能打算bmi >= 18.5 and bmi <25,如果两个条件都为True,则为True。